Creation - - 13/04/2020

Load occurrence dataset

cannot open file 'data-cetaceans/cetacea_pbdb_11_May_2020.csv': No such file or directoryError in file(file, "rt") : cannot open the connection

Reorder accepted ranks according to classification standard.

 [1] "family"         "genus"          "infraorder"     "order"          "species"        "subfamily"      "suborder"      
 [8] "subspecies"     "superfamily"    "unranked clade"

Load the list of occurrences with morphological information

                      Taxon    composite..n.y.     occ.data.based.on        Specimen  pbdb_specimen_no pbdb_occurence.number
 Aetiocetus_cotylalveus  : 1   Min.   :0.0000               :60      AMNH 9485  : 1   Min.   : 25492   Min.   :  68135      
 Agorophius_pygmaeus     : 1   1st Qu.:0.0000   CMM-V-15    : 1      CASG 66660 : 1   1st Qu.: 25706   1st Qu.: 461107      
 Albertocetus_meffordorum: 1   Median :0.0000   MGGC 8548   : 1      CCNHM-101  : 1   Median : 25922   Median : 487310      
 Albireo_whistleri       : 1   Mean   :0.3768   MNHN SAS 933: 1      ChM PV4256 : 1   Mean   : 35167   Mean   : 631596      
 Archaeodelphis_patrius  : 1   3rd Qu.:1.0000   UCMP 83790  : 1      ChM PV4844 : 1   3rd Qu.: 26035   3rd Qu.: 763082      
 Ashleycetus_planicapitis: 1   Max.   :1.0000   USNM 10484  : 1      CHM_PV_4253: 1   Max.   :146940   Max.   :1360382      
 (Other)                 :63                    (Other)     : 4      (Other)    :63   NA's   :56                            
                                                                                                                                                                             notes   
                                                                                                                                                                                :62  
 actually this info relates to the holotype, which is MGGC 8608, but it seems that MGGC 8599 has not been entered                                                               : 1  
 It is unclear which specimen is in the pbdb, both are from the Pisco Formation. This one is the referred specimen, not the holotype (but ir is more complete than the holotype): 1  
 two specimen numbers in pbdb, but both relate to same specimen                                                                                                                 : 1  
 two specimens in database, but one comes from USA, so I selected the one from Peru based on collection info                                                                    : 1  
 two specimens in pbdb, unlcear which is which because they belong to the same horizon                                                                                          : 1  
 (Other)                                                                                                                                                                        : 2  

Combine those taxa with extant taxa to get all the species included in the tree.

                        taxon         min         max   
 Balaena_mysticetus        : 1   Min.   :0   Min.   :0  
 Balaenoptera_acutorostrata: 1   1st Qu.:0   1st Qu.:0  
 Balaenoptera_bonaerensis  : 1   Median :0   Median :0  
 Balaenoptera_borealis     : 1   Mean   :0   Mean   :0  
 Balaenoptera_brydei       : 1   3rd Qu.:0   3rd Qu.:0  
 Balaenoptera_edeni        : 1   Max.   :0   Max.   :0  
 (Other)                   :82                          
                      taxon         min              max       
 Aetiocetus_cotylalveus  : 1   Min.   : 2.588   Min.   : 3.60  
 Agorophius_pygmaeus     : 1   1st Qu.: 7.246   1st Qu.:11.62  
 Albertocetus_meffordorum: 1   Median :13.820   Median :15.97  
 Albireo_whistleri       : 1   Mean   :14.357   Mean   :18.28  
 Archaeodelphis_patrius  : 1   3rd Qu.:23.030   3rd Qu.:28.10  
 Ashleycetus_planicapitis: 1   Max.   :41.300   Max.   :47.80  
 (Other)                 :63                                   
                        taxon          min             max        
 Balaena_mysticetus        :  1   Min.   : 0.00   Min.   : 0.000  
 Balaenoptera_acutorostrata:  1   1st Qu.: 0.00   1st Qu.: 0.000  
 Balaenoptera_bonaerensis  :  1   Median : 0.00   Median : 0.000  
 Balaenoptera_borealis     :  1   Mean   : 6.31   Mean   : 8.035  
 Balaenoptera_brydei       :  1   3rd Qu.:11.62   3rd Qu.:13.820  
 Balaenoptera_edeni        :  1   Max.   :41.30   Max.   :47.800  
 (Other)                   :151                                   

Check that the names in the datasets are exactly the same as in the list above.

[1] TRUE

Idem at the generic level for the genus analysis.

                        taxon         min         max   
 Balaena_mysticetus        : 1   Min.   :0   Min.   :0  
 Balaenoptera_physalus     : 1   1st Qu.:0   1st Qu.:0  
 Berardius_bairdii         : 1   Median :0   Median :0  
 Caperea_marginata         : 1   Mean   :0   Mean   :0  
 Cephalorhynchus_heavisidii: 1   3rd Qu.:0   3rd Qu.:0  
 Delphinapterus_leucas     : 1   Max.   :0   Max.   :0  
 (Other)                   :35                          
                      taxon         min              max       
 Aetiocetus_cotylalveus  : 1   Min.   : 2.588   Min.   : 3.60  
 Agorophius_pygmaeus     : 1   1st Qu.: 7.246   1st Qu.:11.62  
 Albertocetus_meffordorum: 1   Median :13.820   Median :15.97  
 Albireo_whistleri       : 1   Mean   :14.960   Mean   :18.95  
 Archaeodelphis_patrius  : 1   3rd Qu.:23.030   3rd Qu.:28.10  
 Ashleycetus_planicapitis: 1   Max.   :41.300   Max.   :47.80  
 (Other)                 :56                                   
                        taxon         min              max        
 Balaena_mysticetus        : 1   Min.   : 0.000   Min.   : 0.000  
 Balaenoptera_physalus     : 1   1st Qu.: 0.000   1st Qu.: 0.000  
 Berardius_bairdii         : 1   Median : 5.333   Median : 7.246  
 Caperea_marginata         : 1   Mean   : 9.005   Mean   :11.409  
 Cephalorhynchus_heavisidii: 1   3rd Qu.:15.970   3rd Qu.:20.440  
 Delphinapterus_leucas     : 1   Max.   :41.300   Max.   :47.800  
 (Other)                   :97                                    

Check that the names in the datasets are exactly the same as in the list above.

[1] TRUE

Remove those occurrences from our initial dataset to avoid redundancy.

Explore the dataset

Repartition through time

Full fossil record

\(\to\) Numerous occurrences seem to have the same age interval so in order to avoid clusters let’s draw them uniformly in their stratigraphic range rather than taking the mean.

\(\to\) The repartition seems much smoother now.

Subsampling

These occurrences are too numerous for our current implementation, let’s subsample a fraction of them for now.

\(\to\) The distribution looks similar, with some noise due to higher variance with smaller sample.

Repartition among accepted ranks

Pie chart

\(\to\) Half of the occurrences are identified at the level of the secies and 1/3 at the genus or family.

Some clades are unranked :


  Chaeomysticeti          Neoceti Panphyseteroidea       Pelagiceti  Platanidelphidi       Squaloceti 
              26                2                1                1                1                1 

Time repartition by rank

\(\to\) Apparent huge cluster of occurrences in recent times, with very precise dating = Artefact due to the “Pull of the Recent” effect ? \(\to\) We decided to remove all Late Pleistocene and Holocene occurrences (thus setting the \(\omega\)-sampling to 0) in order to avoid this bias.

\(\to\) We observe similar trends at each rank, with peaks at ~15My and ~5My.

Redundancy of occurrences with the same accepted name

\(\to\) ~Half of species/genera/subfamilies have only one specimen by accepted name, but it could go up to ~50 within the same species and ~200 occurrences within the same suborder. Those differences will have to be corrected because in our model all species are upposed to have the same abundance (identical sampling rates among branches).

\(\implies\) Our goal now will be to correct this abundance bias.

Time intervals = stratigraphic age uncertainty

Minimum and maximum stratigraphic limits

\(\to\) Most species have a early but not a late stratigraphic limit.

Minimum and maximum ages

Time ranges = duration of the time intervals

Count occurrences by accepted name

\(\to\) Some occurrences have too much age uncertainty, they risk to artificially increase species durations.

Remove occurrences with highly uncertain dating (range > 10My)

[1] 3505  117

Most of occurrences show less than 10 My age uncertainty, let’s try to keep only these ones.

\(\to\) The removal of highly uncertain occurrences seems to be only a little biased, even if uncertainty globally increases with age.

\(\to\) Some species (or other ranks) have several occurrences with several time ranges, let’s combine them into a unique range covering all the others.

Combined time ranges = unique time range for occurrences with the same name (without the biggest ones)

Occurrence density

Density distributions

\(\to\) Density logically increases as taxa ranks increase.

Correlation between time range and age

If we want to correct species abundance differences based on the number of occurrences in the time range (“density”), those factors should not depend on time in order to avoid penalizing periods with higher densities.

\(\to\) It seems that age range varies importantly with time, but when taking the full combined range into account the correlation seems quite weak after the first million years.

Let’s look at the density directly, because this is what is interesting us directly.

\(\to\) The density based on combined ranges is much less time-dependant than the density based on initial range ages. We will therefore use the combined density for our corrections.

Sub-sampling of occurrences with a normalized density along the combined ranges

Compare densities for single vs. combined ranges.

\(\to\) Densities are smaller and more concentrated with the combined ranges (larger time span + less ranges in total because of the collepses into unique ranges).

Compare densities by accepted name count (species only)

Let’s focus now on the occurrences accepted at the species level because they are the one for which we can correct the abundance bias by subsampling the most concentrated combined intervals.

\(\to\) Their is a huge span of densities driven by the number of occurrences for the same species that we can reduce by subsampling the most concentrated intervals.

Impact of correcting subsampling on density distributions (species only)

\(\to\) Subsampling successfully reduces the density span from 2 to 1 order of magnitude.

Impact of subsampling on occurrences repartition (species only)

See what our distributions loook like after subsampling :

\(\to\) Some highly dense cluster became much more similar to the others.

If we superpose these 2 plots :

\(\to\) We get the new species occurrence repartition after subsampling correction, that could be used for doing inference with the occurrence birth-death model.

New developments

Compare with a Poisson sampling process

In order to check if the data fit our assumptions of constant-fossilisation-rate Poisson sampling we compare the observed occurrences distributions with the expected ones. Specifically, we will look at the number of taxa represented by 1, 2, 3, … occurrences and the one that we would expect for a given distribution of combined age ranges (as a proxy for species duration).

In a Poisson process with occurrence sampling rate \(\omega\) and for a given time interval of length \(t\), the probability of observing \(N_t = k\) occurrences is given by the Poisson distribution of mean of parameter \(\omega\times t\) :

\[\mathbb{P}(N_t=k) = e^{-\omega t}\frac{(\omega t)^k}{k!}\]

So in order to have the absolute probability of observing \(N_0 = n\) occurrences we have to integrate over the full distribution of age ranges \(t\), called \(f(t)\) :

\[\mathbb{P}(N_0 = n) = \int_t P(N_t = n) f(t) dt = \int_t e^{-\omega t}\frac{(\omega t)^n}{n!} f(t) dt\]

First, approximate this distribution :

Then integrate and plot the expected distribution for a given omega :

Finally, try to find an \(\omega\) value that approximately fits the first points (the least affected by oversampling biases) and check if the other points follow the expected curve :

\(\implies\) Initial observations really do not fit the expectations, species with more than 5 occurrences must remain very rare ! But our subsampling seems to correct most of this bias.

However, this method requires to make several arbitrary choices that may introduce new biases so we will instead subsample at other levels (palaeontological collection, geological formation). In each case only one occurrence will be sampled for the similarly identified, a process we will refer to as aggregating these occurrences according to the chosen factor.

Aggregate similarly identified occurrences in each collection

\(\to\) Each collection corresponds to a unique time interval (inferred from the unique age mean).

In order to reduce the abundance bias, we may keep only one occurrence for each collection :

\(\to\) Not enough occurrences are removed to make a sufficient difference. If we look at the collection with the highest number of occurrences :


        Aprixokogia kelloggi                      Balaena   Balaenoptera acutorostrata              Balaenopteridae 
                           1                            2                            2                            2 
                   Balaenula      Bohaskaia monodontoides                Cetotheriinae               Delphinapterus 
                           2                            1                            1                            3 
                 Delphinidae                    Delphinus                 Globicephala          Gricetoides aurorae 
                           2                            2                            2                            1 
              Herpetocetinae       Herpetocetus sendaicus Herpetocetus transatlanticus              Kogia breviceps 
                           1                            1                            1                            1 
                    Kogiidae                     Kogiinae          Kogiopsis floridana               Lagenorhynchus 
                           1                            2                            1                            2 
    Lagenorhynchus harmatuki                    Megaptera      Mesoplodon longirostris                      Monodon 
                           1                            2                            2                            1 
    Ninoziphius platyrostris                Orycterocetus       Physeter macrocephalus                 Physeteridae 
                           3                            1                            1                            1 
                Physeterinae           Physeterula dubusi                  Plesiocetus        Pliopontos littoralis 
                           2                            1                            1                            1 
                  Pontoporia                Pontoporiidae                    Pseudorca                  Scaldicetus 
                           1                            2                            2                            1 
                    Stenella                Stenella rayi                     Tursiops          Ziphius cavirostris 
                           2                            1                            2                            2 

\(\to\) There are very few redundancies among the accepted names in collections so aggregating those won’t reduce the abundance bias.

Instead, we may try to aggregate occurrences with the same accepted name at the level of the geological formation (ie subsample only one for each).

Aggregate similarly identified occurrences in each formation

\(\to\) For most formations each species seems to be restricted to only one age, so as expected we are not loosing too much information when aggregating them to a single occurrence.

\(\to\) In that case the sub-sampling is big enough to hope correcting our bias.

\(\to\) The bias can be corridered as completely corrected.

Removed 2 rows containing missing values (geom_bar).

Removed 2 rows containing missing values (geom_bar).

Removed 2 rows containing missing values (geom_bar).Removed 2 rows containing missing values (geom_bar).

\(\to\) Comparing with the initial occurrences distribution and with the distribution after our first sub-sampling it appears that both methods lead to very similar distributions. This conforts us about the robustness of those approaches.

However, we have to take into account the occurrences that do not have any indicated geological formation to subsample them separately. To approximate geological formation we chose to proceed to the aggregation based on the combination of the country and the early stratigraphic interval.

Aggregate occurrences without formation by country + early interval

More occurrences remain after aggregating with this new method. Let’s compare again with the theoretical distribution :

\(\to\) The correspondance is still good, except for two taxa :


   Scaldicetus grandis Schizodelphis sulcatus 
                    14                     16 

Removed 2 rows containing missing values (geom_bar).

Removed 2 rows containing missing values (geom_bar).

Removed 2 rows containing missing values (geom_bar).Removed 2 rows containing missing values (geom_bar).

\(\to\) Comparing with the initial occurrences distribution and with the distribution after our first sub-sampling it appears that both methods lead to very similar distributions. This conforts us about the robustness of those approaches.

Replacing coutries by gelogical plates seems to make more sens from a palaeontological perspective, so let’s try it.

Aggregate occurrences without formation by geoplate + early interval

More occurrences remain after aggregating with this new method. Let’s compare again with the theoretical distribution :

\(\to\) The correspondance is still good, except for two taxa :


   Scaldicetus grandis Schizodelphis sulcatus 
                    13                     15 
Removed 2 rows containing missing values (geom_bar).

Removed 2 rows containing missing values (geom_bar).

Removed 2 rows containing missing values (geom_bar).Removed 2 rows containing missing values (geom_bar).

\(\to\) Delimiting by geological plates (+ age) instead of countries (+ age) leads to similar distributions, so we will keep it.

Check that the sampling methods do not introduce biases in the repartition between Odontoceti and Mysticeti

Mystecetes are usually larger than odontocetes, and size is associated with a wider geographic range so since we are subsampling occurrences according to geological formation we may be biasing our data towards more widespread species, therefore towards mystecetes.

Look at the families first :

\(\to\) The family repartitions vary a bit after subsampling, but because of the limited number of species by family the fact that we corrected the oversampling of some species could have a disproportionate effect.

Let’s look rather at a higher taxonomic rank, by importing the topology of cetacean families (from Marx et al. 2016) :

`data_frame()` is deprecated as of tibble 1.1.0.
Please use `tibble()` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.

\(\to\) There is a smaller proportion of archeocete occurrences after either sampling, because a huge cluster is subsampled around 35 My ago, but this effect is expected. However, for the Mysticeti vs. Odotoceti there is no huge apparent bias, especially with the aggregating method.

Faster genus-level analysis

More occurrences remain after aggregating with this new method. Let’s compare again with the theoretical distribution :

\(\to\) The correspondance is much less improved than with species aggregation because some genera have a lot of occurrences due to their high number of species species :


Balaenoptera   Kentriodon   Mesoplodon  Scaldicetus    Squalodon 
          53           27           30           41           40 
Removed 2 rows containing missing values (geom_bar).

Removed 2 rows containing missing values (geom_bar).

Removed 2 rows containing missing values (geom_bar).Removed 2 rows containing missing values (geom_bar).

\(\to\) Delimiting by geological plates (+ age) instead of countries (+ age) leads to similar distributions, with a bit more occurrences, so we will keep it.

Conclusions

Achievements :

Open questions :

LS0tCnRpdGxlOiAiRm9ybWF0IENldGFjZWFucyBEYXRhIgpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiAKICAgIGZpZ19oZWlnaHQ6IDUuNQogICAgZmlnX3dpZHRoOiAxMAogICAgdG9jOiB5ZXMKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgaHRtbF9kb2N1bWVudDoKICAgIGZpZ193aWR0aDogMTAKICAgIHRvYzogeWVzCi0tLQoKQ3JlYXRpb24gLSBqZXJlbXkuYW5kcmVvbGV0dGlAZW5zLmZyIC0gMTMvMDQvMjAyMAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoImRwbHlyIikKbGlicmFyeSgiZ2d0cmVlIikKYGBgCgojIExvYWQgb2NjdXJyZW5jZSBkYXRhc2V0CgpgYGB7cn0KIyBjZXRhY2VhX3BiZGIgPC0gcmVhZC5jc3YoIi4uL2RhdGEtY2V0YWNlYW5zL2NldGFjZWFfcGJkYl8wNV9BcHJfMjAxOC5jc3YiLCBza2lwID0gMTYpCmNldGFjZWFfcGJkYiA8LSByZWFkLmNzdjIoIi4uL2RhdGEtY2V0YWNlYW5zL2NldGFjZWFfcGJkYl8xMV9NYXlfMjAyMC5jc3YiLCBza2lwID0gMTcpCiMgUmVtb3ZlIGNvbHVtbnMgd2l0aCBvbmx5IE5BcwpjZXRhY2VhX3BiZGIgPC0gY2V0YWNlYV9wYmRiWyxjb2xTdW1zKGlzLm5hKGNldGFjZWFfcGJkYikpIDwgbnJvdyhjZXRhY2VhX3BiZGIpXQojIFJlY29yZCBjbGFzc3lpbmcgbnVtYmVycyBhcyBmYWN0b3JzCmNldGFjZWFfcGJkYlssIGdyZXAoIl9ubyIsIG5hbWVzKGNldGFjZWFfcGJkYiksIHZhbHVlID0gVCldIDwtIGRhdGEuZnJhbWUoc2FwcGx5KGNldGFjZWFfcGJkYlssIGdyZXAoIl9ubyIsIG5hbWVzKGNldGFjZWFfcGJkYiksIHZhbHVlID0gVCldLCBhcy5mYWN0b3IpKQojIFJlY29yZCBudW1lcmljIHF1YW50aXRpZXMgYXMgZG91YmxlcwpjZXRhY2VhX3BiZGJbLCBjKCJsYXQiLCAibG5nIiwgInBhbGVvbGF0IiwgInBhbGVvbG5nIiwgIm1pbl9tYSIsICJtYXhfbWEiKV0gPC0gc2FwcGx5KGNldGFjZWFfcGJkYlssIGMoImxhdCIsICJsbmciLCAicGFsZW9sYXQiLCAicGFsZW9sbmciLCAibWluX21hIiwgIm1heF9tYSIpXSwgZnVuY3Rpb24oY29sKXthcy5udW1lcmljKGFzLmNoYXJhY3Rlcihjb2wpKX0pCnN1bW1hcnkoY2V0YWNlYV9wYmRiW2dyZXAoImNvbW1lbnQiLCBuYW1lcyhjZXRhY2VhX3BiZGIpLCB2YWx1ZSA9IFQsIGludmVydD1UKV0pCmBgYAoKYGBge3J9CmhlYWQoY2V0YWNlYV9wYmRiLCAxMCkKYGBgCgpSZW9yZGVyIGFjY2VwdGVkIHJhbmtzIGFjY29yZGluZyB0byBjbGFzc2lmaWNhdGlvbiBzdGFuZGFyZC4KCmBgYHtyfQpsZXZlbHMoY2V0YWNlYV9wYmRiJGFjY2VwdGVkX3JhbmspCmNldGFjZWFfcGJkYiRhY2NlcHRlZF9yYW5rIDwtIGZhY3RvcihjZXRhY2VhX3BiZGIkYWNjZXB0ZWRfcmFuaywgbGV2ZWxzPWMoInN1YnNwZWNpZXMiLCAic3BlY2llcyIsICJnZW51cyIsICJzdWJmYW1pbHkiLCAiZmFtaWx5IiwgInN1cGVyZmFtaWx5IiwgImluZnJhb3JkZXIiLCAic3Vib3JkZXIiLCAib3JkZXIiLCAidW5yYW5rZWQgY2xhZGUiKSkKY2V0YWNlYV9wYmRiJGlkZW50aWZpZWRfcmFuayA8LSBmYWN0b3IoY2V0YWNlYV9wYmRiJGlkZW50aWZpZWRfcmFuaywgbGV2ZWxzPWMoInN1YnNwZWNpZXMiLCAic3BlY2llcyIsICJnZW51cyIsICJzdWJmYW1pbHkiLCAiZmFtaWx5IiwgInN1cGVyZmFtaWx5IiwgImluZnJhb3JkZXIiLCAic3Vib3JkZXIiLCAib3JkZXIiLCAidW5yYW5rZWQgY2xhZGUiKSkKYGBgCgojIExvYWQgdGhlIGxpc3Qgb2Ygb2NjdXJyZW5jZXMgd2l0aCBtb3JwaG9sb2dpY2FsIGluZm9ybWF0aW9uCgpgYGB7cn0Kb2NjdXJyZW5jZXNfd2l0aF9tb3JwaG9sb2d5IDwtIHJlYWQuY3N2MigiLi4vZGF0YS1jZXRhY2VhbnMvU3BlY2ltZW5zUEJEQl9uZXdOYW1lcy5jc3YiKQpzdW1tYXJ5KG9jY3VycmVuY2VzX3dpdGhfbW9ycGhvbG9neSkKYGBgCgpDb21iaW5lIHRob3NlIHRheGEgd2l0aCBleHRhbnQgdGF4YSB0byBnZXQgYWxsIHRoZSBzcGVjaWVzIGluY2x1ZGVkIGluIHRoZSB0cmVlLgoKYGBge3J9CmV4dGFudF90YXhhIDwtIHJlYWQuY3N2MigiLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9leHRhbnRfdGF4YS5jc3YiKQpzdW1tYXJ5KGV4dGFudF90YXhhKQpgYGAKCmBgYHtyfQpleHRpbmN0X3RheGEgPC0gY2V0YWNlYV9wYmRiW2NldGFjZWFfcGJkYiRvY2N1cnJlbmNlX25vICVpbiUgb2NjdXJyZW5jZXNfd2l0aF9tb3JwaG9sb2d5JHBiZGJfb2NjdXJlbmNlLm51bWJlciwgYygiYWNjZXB0ZWRfbmFtZSIsICJtaW5fbWEiLCAibWF4X21hIildCmV4dGluY3RfdGF4YSRhY2NlcHRlZF9uYW1lIDwtIGFzLmZhY3Rvcihnc3ViKCIgIiwgIl8iLCBleHRpbmN0X3RheGEkYWNjZXB0ZWRfbmFtZSkpCm5hbWVzKGV4dGluY3RfdGF4YSkgPC0gbmFtZXMoZXh0YW50X3RheGEpCnN1bW1hcnkoZXh0aW5jdF90YXhhKQpgYGAKCmBgYHtyfQp0YXhhIDwtIHJiaW5kKGV4dGFudF90YXhhLCBleHRpbmN0X3RheGEpCnN1bW1hcnkodGF4YSkKd3JpdGUudGFibGUodGF4YSwgZmlsZSA9ICIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX3RheGEuY3N2IiwgcXVvdGUgPSBGLCBzZXA9Ilx0Iiwgcm93Lm5hbWVzID0gRikKYGBgCgpDaGVjayB0aGF0IHRoZSBuYW1lcyBpbiB0aGUgZGF0YXNldHMgYXJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgaW4gdGhlIGxpc3QgYWJvdmUuCgpgYGB7cn0KbW9ycGhvX25hbWVzIDwtIHJlYWQudGFibGUoIi4uL2RhdGEtY2V0YWNlYW5zL21vcnBob19zaW1wbGlmaWVkX25ld05hbWVzX3JlbW92ZU91dGdyb3Vwc1VuZGVzY3JpYmVkLm5leCIsIHNraXA9NiwgZmlsbD1UKQptb3JwaG9fbmFtZXMgPC0gZHJvcGxldmVscyhtb3JwaG9fbmFtZXMkVjFbc2FwcGx5KG1vcnBob19uYW1lcyRWMSwgZ3JlcGwsIHBhdHRlcm49Il8iKV0pCgptaXRfbmFtZXMgPC0gcmVhZC50YWJsZSgiLi4vZGF0YS1jZXRhY2VhbnMvTTQzNzZfbXRfc2ltcGxpZmllZF9uZXdOYW1lc19yZW1vdmVPdXRncm91cHMubmV4Iiwgc2tpcD02LCBmaWxsPVQpCm1pdF9uYW1lcyA8LSBkcm9wbGV2ZWxzKG1pdF9uYW1lcyRWMVtzYXBwbHkobWl0X25hbWVzJFYxLCBncmVwbCwgcGF0dGVybj0iXyIpXSkKCm51Y19uYW1lcyA8LSByZWFkLnRhYmxlKCIuLi9kYXRhLWNldGFjZWFucy9NNDM1OF9udWNsZWFyX3NpbXBsaWZpZWRfbmV3TmFtZXNfcmVtb3ZlT3V0Z3JvdXBzLm5leCIsIHNraXA9NiwgZmlsbD1UKQpudWNfbmFtZXMgPC0gZHJvcGxldmVscyhudWNfbmFtZXMkVjFbc2FwcGx5KG51Y19uYW1lcyRWMSwgZ3JlcGwsIHBhdHRlcm49Il8iKV0pCgpzZXRlcXVhbCh0YXhhJHRheG9uLCB1bmlvbih1bmlvbihtb3JwaG9fbmFtZXMsIG1pdF9uYW1lcyksIG51Y19uYW1lcykpCmBgYAoKSWRlbSBhdCB0aGUgZ2VuZXJpYyBsZXZlbCBmb3IgdGhlIGdlbnVzIGFuYWx5c2lzLgoKYGBge3J9Cm9jY3VycmVuY2VzX3dpdGhfbW9ycGhvbG9neV9nZW5lcmEgPC0gb2NjdXJyZW5jZXNfd2l0aF9tb3JwaG9sb2d5Wy13aGljaChvY2N1cnJlbmNlc193aXRoX21vcnBob2xvZ3kkVGF4b24gJWluJSBjKCJBdG9jZXR1c19uYXNhbGlzIiwgIkJyYWNoeWRlbHBoaXNfamFodWF5ZW5zaXMiLCAiSGFib3JvcGhvY29lbmFfbWludXR1cyIsICJMb3Bob2NldHVzX3JlcGVubmluZ2kiLCAiT2RvYmVub2NldG9wc19wZXJ1dmlhbnVzIiwgIk90ZWthaWtlYV9odWF0YSIsICJQYXJhcG9udG9wb3JpYV93aWxzb25pIikpLF0KZXh0YW50X2dlbmVyYSA8LSByZWFkLmNzdjIoIi4uL2RhdGEtY2V0YWNlYW5zL0NldGFjZWFfZXh0YW50X2dlbmVyYS5jc3YiKQpzdW1tYXJ5KGV4dGFudF9nZW5lcmEpCgpleHRpbmN0X2dlbmVyYSA8LSBjZXRhY2VhX3BiZGJbY2V0YWNlYV9wYmRiJG9jY3VycmVuY2Vfbm8gJWluJSBvY2N1cnJlbmNlc193aXRoX21vcnBob2xvZ3lfZ2VuZXJhJHBiZGJfb2NjdXJlbmNlLm51bWJlciwgYygiYWNjZXB0ZWRfbmFtZSIsICJtaW5fbWEiLCAibWF4X21hIildCmV4dGluY3RfZ2VuZXJhJGFjY2VwdGVkX25hbWUgPC0gYXMuZmFjdG9yKGdzdWIoIiAiLCAiXyIsIGV4dGluY3RfZ2VuZXJhJGFjY2VwdGVkX25hbWUpKQpuYW1lcyhleHRpbmN0X2dlbmVyYSkgPC0gbmFtZXMoZXh0YW50X2dlbmVyYSkKc3VtbWFyeShleHRpbmN0X2dlbmVyYSkKCmdlbmVyYSA8LSByYmluZChleHRhbnRfZ2VuZXJhLCBleHRpbmN0X2dlbmVyYSkKc3VtbWFyeShnZW5lcmEpCndyaXRlLnRhYmxlKGdlbmVyYSwgZmlsZSA9ICIuLi9kYXRhLWNldGFjZWFucy9DZXRhY2VhX2dlbmVyYS5jc3YiLCBxdW90ZSA9IEYsIHNlcD0iXHQiLCByb3cubmFtZXMgPSBGKQpgYGAKCkNoZWNrIHRoYXQgdGhlIG5hbWVzIGluIHRoZSBkYXRhc2V0cyBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyBpbiB0aGUgbGlzdCBhYm92ZS4KCmBgYHtyfQptb3JwaG9fbmFtZXNfZ2VuZXJhIDwtIHJlYWQudGFibGUoIi4uL2RhdGEtY2V0YWNlYW5zL21vcnBob19zaW1wbGlmaWVkX25ld05hbWVzX2dlbmVyYV9yZW1vdmVPdXRncm91cHNVbmRlc2NyaWJlZC5uZXgiLCBza2lwPTYsIGZpbGw9VCkKbW9ycGhvX25hbWVzX2dlbmVyYSA8LSBkcm9wbGV2ZWxzKG1vcnBob19uYW1lc19nZW5lcmEkVjFbc2FwcGx5KG1vcnBob19uYW1lc19nZW5lcmEkVjEsIGdyZXBsLCBwYXR0ZXJuPSJfIildKQoKbWl0X25hbWVzX2dlbmVyYSA8LSByZWFkLnRhYmxlKCIuLi9kYXRhLWNldGFjZWFucy9NNDM3Nl9tdF9zaW1wbGlmaWVkX25ld05hbWVzX2dlbmVyYV9yZW1vdmVPdXRncm91cHMubmV4Iiwgc2tpcD02LCBmaWxsPVQpCm1pdF9uYW1lc19nZW5lcmEgPC0gZHJvcGxldmVscyhtaXRfbmFtZXNfZ2VuZXJhJFYxW3NhcHBseShtaXRfbmFtZXNfZ2VuZXJhJFYxLCBncmVwbCwgcGF0dGVybj0iXyIpXSkKCm51Y19uYW1lc19nZW5lcmEgPC0gcmVhZC50YWJsZSgiLi4vZGF0YS1jZXRhY2VhbnMvTTQzNThfbnVjbGVhcl9zaW1wbGlmaWVkX25ld05hbWVzX2dlbmVyYV9yZW1vdmVPdXRncm91cHMubmV4Iiwgc2tpcD02LCBmaWxsPVQpCm51Y19uYW1lc19nZW5lcmEgPC0gZHJvcGxldmVscyhudWNfbmFtZXNfZ2VuZXJhJFYxW3NhcHBseShudWNfbmFtZXNfZ2VuZXJhJFYxLCBncmVwbCwgcGF0dGVybj0iXyIpXSkKCnNldGVxdWFsKGdlbmVyYSR0YXhvbiwgdW5pb24odW5pb24obW9ycGhvX25hbWVzX2dlbmVyYSwgbWl0X25hbWVzX2dlbmVyYSksIG51Y19uYW1lc19nZW5lcmEpKQpgYGAKClJlbW92ZSB0aG9zZSBvY2N1cnJlbmNlcyBmcm9tIG91ciBpbml0aWFsIGRhdGFzZXQgdG8gYXZvaWQgcmVkdW5kYW5jeS4KCmBgYHtyfQpjZXRhY2VhX3BiZGIgPC0gY2V0YWNlYV9wYmRiWyEoY2V0YWNlYV9wYmRiJG9jY3VycmVuY2Vfbm8gJWluJSBvY2N1cnJlbmNlc193aXRoX21vcnBob2xvZ3kkcGJkYl9vY2N1cmVuY2UubnVtYmVyKSxdCmBgYAoKIyBFeHBsb3JlIHRoZSBkYXRhc2V0CiMjIFJlcGFydGl0aW9uIHRocm91Z2ggdGltZQojIyMgRnVsbCBmb3NzaWwgcmVjb3JkCgpgYGB7cn0KIyBDb21wdXRlIHRoZSBtZWFuIGFnZSBpbiB0aGUgdGltZSBpbnRlcnZhbApjZXRhY2VhX3BiZGIkYWdlX21lYW4gPC0gKGNldGFjZWFfcGJkYiRtaW5fbWErY2V0YWNlYV9wYmRiJG1heF9tYSkvMgoKZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9LWFnZV9tZWFuLCB5PXJub3JtKGxlbmd0aChhZ2VfbWVhbiksIDEsIDAuMDUpKSkgKwogIGdlb21fcG9pbnQoY2V4PTAuMSwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk9jY3VycmVuY2VzIiwgbGltaXRzID0gYygwLjUsIDEuNSkpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUocGFzdGUoIlJlcGFydGl0aW9uIG9mIiwgZGltKGNldGFjZWFfcGJkYilbMV0sICJyZWNvcmRlZCBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUiKSkKCmdncGxvdChjZXRhY2VhX3BiZGIsIGFlcyh4PS1hZ2VfbWVhbikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgZ2d0aXRsZShwYXN0ZSgiRXZvbHV0aW9uIG9mIHRoZSBudW1iZXIgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lICggdG90YWwgb2YiLCBkaW0oY2V0YWNlYV9wYmRiKVsxXSwgIikgLSBNaWRwb2ludCIpKQpgYGAKCiRcdG8kIE51bWVyb3VzIG9jY3VycmVuY2VzIHNlZW0gdG8gaGF2ZSB0aGUgc2FtZSBhZ2UgaW50ZXJ2YWwgc28gaW4gb3JkZXIgdG8gYXZvaWQgY2x1c3RlcnMgbGV0J3MgZHJhdyB0aGVtIHVuaWZvcm1seSBpbiB0aGVpciBzdHJhdGlncmFwaGljIHJhbmdlIHJhdGhlciB0aGFuIHRha2luZyB0aGUgbWVhbi4KCmBgYHtyfQojIERyYXcgb2NjdXJyZW5jZSBhZ2UgdW5pZm9ybWFsbHkgaW4gdGhlIHRpbWUgaW50ZXJ2YWwKY2V0YWNlYV9wYmRiJGFnZV9ydW5pZiA8LSBtYXBwbHkoZnVuY3Rpb24obSwgTSl7cnVuaWYobj0xLCBtaW49bSwgbWF4PU0pfSwgY2V0YWNlYV9wYmRiJG1pbl9tYSwgY2V0YWNlYV9wYmRiJG1heF9tYSkKCmdncGxvdChjZXRhY2VhX3BiZGIsIGFlcyh4PS1hZ2VfcnVuaWYsIHk9cm5vcm0obGVuZ3RoKGFnZV9ydW5pZiksIDEsIDAuMDUpKSkgKwogIGdlb21fcG9pbnQoY2V4PTAuMSwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk9jY3VycmVuY2VzIiwgbGltaXRzID0gYygwLjUsIDEuNSkpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUocGFzdGUoIlJlcGFydGl0aW9uIG9mIiwgZGltKGNldGFjZWFfcGJkYilbMV0sICJyZWNvcmRlZCBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUiKSkKCmdncGxvdChjZXRhY2VhX3BiZGIsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIGdndGl0bGUocGFzdGUoIkV2b2x1dGlvbiBvZiB0aGUgbnVtYmVyIG9jY3VycmVuY2VzIHRocm91Z2ggdGltZSAoIHRvdGFsIG9mIiwgZGltKGNldGFjZWFfcGJkYilbMV0sICIpIC0gVW5pZm9ybSBkcmF3IikpCmBgYAoKJFx0byQgVGhlIHJlcGFydGl0aW9uIHNlZW1zIG11Y2ggc21vb3RoZXIgbm93LgoKIyMjIFN1YnNhbXBsaW5nCgpUaGVzZSBvY2N1cnJlbmNlcyBhcmUgdG9vIG51bWVyb3VzIGZvciBvdXIgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgbGV0J3Mgc3Vic2FtcGxlIGEgZnJhY3Rpb24gb2YgdGhlbSBmb3Igbm93LgoKYGBge3J9CmNldGFjZWFfcGJkYl9zdWJzYW1wbGVkIDwtIHNhbXBsZV9uKGNldGFjZWFfcGJkYiwgc2l6ZT1yb3VuZChsZW5ndGgoYWdlX3J1bmlmKSowLjEwKSkKCmdncGxvdChjZXRhY2VhX3BiZGJfc3Vic2FtcGxlZCwgYWVzKHg9LWFnZV9ydW5pZiwgeT1ybm9ybShsZW5ndGgoYWdlX3J1bmlmKSwgMSwgMC4wNSkpKSArCiAgZ2VvbV9wb2ludChjZXg9MC41LCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiT2NjdXJyZW5jZXMiLCBsaW1pdHMgPSBjKDAuNSwgMS41KSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZShwYXN0ZSgiUmVwYXJ0aXRpb24gb2YiLCBkaW0oY2V0YWNlYV9wYmRiX3N1YnNhbXBsZWQpWzFdLCAicmVjb3JkZWQgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lIikpCgpnZ3Bsb3QoY2V0YWNlYV9wYmRiX3N1YnNhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIGdndGl0bGUocGFzdGUoIkV2b2x1dGlvbiBvZiB0aGUgbnVtYmVyIG9jY3VycmVuY2VzIHRocm91Z2ggdGltZSAoIHRvdGFsIG9mIiwgZGltKGNldGFjZWFfcGJkYl9zdWJzYW1wbGVkKVsxXSwgIikgLSBVbmlmb3JtIGRyYXciKSkKYGBgCgokXHRvJCBUaGUgZGlzdHJpYnV0aW9uIGxvb2tzIHNpbWlsYXIsIHdpdGggc29tZSBub2lzZSBkdWUgdG8gaGlnaGVyIHZhcmlhbmNlIHdpdGggc21hbGxlciBzYW1wbGUuCgpgYGB7cn0Kd3JpdGUoY2V0YWNlYV9wYmRiJGFnZV9tZWFuLCBmaWxlID0gIi4uL2RhdGEtY2V0YWNlYW5zL0NldGFjZWFfb2NjdXJyZW5jZXNfbWVhbl9hZ2UuY3N2Iiwgc2VwPSI7ICIsIG5jb2x1bW5zID0gZGltKGNldGFjZWFfcGJkYilbMV0pCndyaXRlKGNldGFjZWFfcGJkYiRhZ2VfcnVuaWYsIGZpbGUgPSAiLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9hZ2VfcnVuaWZfYWdlLmNzdiIsIHNlcD0iOyAiLCBuY29sdW1ucyA9IGRpbShjZXRhY2VhX3BiZGIpWzFdKQp3cml0ZShjZXRhY2VhX3BiZGJfc3Vic2FtcGxlZCRhZ2VfcnVuaWYsIGZpbGUgPSAiLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9hZ2VfcnVuaWZfYWdlX3N1YnNhbXBsZWQuY3N2Iiwgc2VwPSI7ICIsIG5jb2x1bW5zID0gZGltKGNldGFjZWFfcGJkYl9zdWJzYW1wbGVkKVsxXSkKYGBgCgojIyBSZXBhcnRpdGlvbiBhbW9uZyBhY2NlcHRlZCByYW5rcwojIyMgUGllIGNoYXJ0CgpgYGB7cn0KZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9ZmFjdG9yKHJlY29yZF90eXBlKSwgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJjb3VudCIpICsKICBjb29yZF9wb2xhcigieSIpICsgCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gTlVMTCwgdGl0bGUgPSAiUmVwYXJ0aXRpb24gb2Ygb2NjdXJyZW5jZXMgYW1vbmcgYWNjZXB0ZWQgcmFua3MiKQpgYGAKCiRcdG8kIEhhbGYgb2YgdGhlIG9jY3VycmVuY2VzIGFyZSBpZGVudGlmaWVkIGF0IHRoZSBsZXZlbCBvZiB0aGUgc2VjaWVzIGFuZCAxLzMgYXQgdGhlIGdlbnVzIG9yIGZhbWlseS4KClNvbWUgY2xhZGVzIGFyZSB1bnJhbmtlZCA6CgpgYGB7cn0KdGFibGUoYXMuY2hhcmFjdGVyKGNldGFjZWFfcGJkYltjZXRhY2VhX3BiZGIkYWNjZXB0ZWRfcmFuaz09InVucmFua2VkIGNsYWRlIixdJGFjY2VwdGVkX25hbWUpKQpgYGAKCiMjIyBUaW1lIHJlcGFydGl0aW9uIGJ5IHJhbmsKCmBgYHtyIGZpZy5oZWlnaHQ9Nn0KZ2dwbG90KGNldGFjZWFfcGJkYltjZXRhY2VhX3BiZGIkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdLCBhZXMoeD0tYWdlX3J1bmlmLCBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJFdm9sdXRpb24gb2YgdGhlIG51bWJlciBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUgKDAuMSBNeSB0aW1lIGJpbnMpLCBieSBhY2NlcHRlZCByYW5rIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcz0iZnJlZSIpCgojIENvdW50IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBhY2NlcHRlZCBuYW1lCmNldGFjZWFfcGJkYiRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShjZXRhY2VhX3BiZGIkYWNjZXB0ZWRfbmFtZSwgZnVuY3Rpb24oeCl7dGFibGUoY2V0YWNlYV9wYmRiJGFjY2VwdGVkX25hbWUpW3hdfSkKIyBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1lIGludGVydmFscwpjZXRhY2VhX3BiZGIkYWdlX3JhbmdlIDwtIGNldGFjZWFfcGJkYiRtYXhfbWEtY2V0YWNlYV9wYmRiJG1pbl9tYQoKZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9YWNjZXB0ZWRfbmFtZV9jb3VudC9hZ2VfcmFuZ2UsIGZpbGw9ZmFjdG9yKG1heF9tYSkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJNYXhpbXVtIGFnZSAoTXkpIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2NjdXJyZW5jZSBkZW5zaXR5LCBieSBhY2NlcHRlZCByYW5rIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4pCgpnZ3Bsb3QoY2V0YWNlYV9wYmRiLCBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50L2FnZV9yYW5nZSwgZmlsbD1mYWN0b3Iocm91bmQoYWdlX3JhbmdlLCAyKSkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBZ2UgcmFuZ2UgKE15KSIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9jY3VycmVuY2UgZGVuc2l0eSwgYnkgYWNjZXB0ZWQgcmFuayIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuKQpgYGAKCiRcdG8kIEFwcGFyZW50IGh1Z2UgY2x1c3RlciBvZiBvY2N1cnJlbmNlcyBpbiByZWNlbnQgdGltZXMsIHdpdGggdmVyeSBwcmVjaXNlIGRhdGluZyA9IEFydGVmYWN0IGR1ZSB0byB0aGUgIlB1bGwgb2YgdGhlIFJlY2VudCIgZWZmZWN0ID8gJFx0byQgV2UgZGVjaWRlZCB0byAqKnJlbW92ZSBhbGwgTGF0ZSBQbGVpc3RvY2VuZSBhbmQgSG9sb2NlbmUgb2NjdXJyZW5jZXMqKiAodGh1cyBzZXR0aW5nIHRoZSAkXG9tZWdhJC1zYW1wbGluZyB0byAwKSBpbiBvcmRlciB0byBhdm9pZCB0aGlzIGJpYXMuCgpgYGB7cn0KQ2V0YWNlYV9vY2MgPC0gY2V0YWNlYV9wYmRiW2NldGFjZWFfcGJkYiRhZ2VfcnVuaWYgPiAwLjEyNixdCgpkYXRhLmZyYW1lKGNldGFjZWFfcGJkYiA9IGRpbShjZXRhY2VhX3BiZGIpWzFdLAogICAgICAgICAgIENldGFjZWFfb2NjID0gZGltKENldGFjZWFfb2NjKVsxXSwKICAgICAgICAgICByZW1vdmVkID0gZGltKGNldGFjZWFfcGJkYilbMV0tZGltKENldGFjZWFfb2NjKVsxXSwKICAgICAgICAgICByb3cubmFtZXMgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTZ9CmdncGxvdChDZXRhY2VhX29jY1shQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInN1YnNwZWNpZXMiLCAiaW5mcmFvcmRlciIpLF0sIGFlcyh4PS1hZ2VfcnVuaWYsIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkV2b2x1dGlvbiBvZiB0aGUgbnVtYmVyIG9jY3VycmVuY2VzIHRocm91Z2ggdGltZSAoMC41IE15IHRpbWUgYmlucyksIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzPSJmcmVlIikKYGBgCgokXHRvJCBXZSBvYnNlcnZlIHNpbWlsYXIgdHJlbmRzIGF0IGVhY2ggcmFuaywgd2l0aCBwZWFrcyBhdCB+MTVNeSBhbmQgfjVNeS4KCiMjIyBSZWR1bmRhbmN5IG9mIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZQoKYGBge3IgZmlnLmhlaWdodD02fQpnZ3Bsb3QoY2V0YWNlYV9wYmRiLCBhZXMoeD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIHRhYmxlKGFjY2VwdGVkX25hbWUpW2FjY2VwdGVkX25hbWVdKSwgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fYmFyKHN0YXQ9ImNvdW50IikgKyAKICBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSAiQWNjZXB0ZWQgbmFtZXMiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBvY2N1cnJlbmNlcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUsIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZCguIH4gYWNjZXB0ZWRfcmFuaywgc2NhbGVzPSJmcmVlX3giKQpgYGAKCiRcdG8kIH5IYWxmIG9mIHNwZWNpZXMvZ2VuZXJhL3N1YmZhbWlsaWVzIGhhdmUgb25seSBvbmUgc3BlY2ltZW4gYnkgYWNjZXB0ZWQgbmFtZSwgYnV0IGl0IGNvdWxkIGdvIHVwIHRvIH41MCB3aXRoaW4gdGhlIHNhbWUgc3BlY2llcyBhbmQgfjIwMCBvY2N1cnJlbmNlcyB3aXRoaW4gdGhlIHNhbWUgc3Vib3JkZXIuICoqVGhvc2UgZGlmZmVyZW5jZXMgd2lsbCBoYXZlIHRvIGJlIGNvcnJlY3RlZCBiZWNhdXNlIGluIG91ciBtb2RlbCBhbGwgc3BlY2llcyBhcmUgdXBwb3NlZCB0byBoYXZlIHRoZSBzYW1lIGFidW5kYW5jZSAoaWRlbnRpY2FsIHNhbXBsaW5nIHJhdGVzIGFtb25nIGJyYW5jaGVzKS4qKgoKJFxpbXBsaWVzJCBPdXIgZ29hbCBub3cgd2lsbCBiZSB0byBjb3JyZWN0IHRoaXMgYWJ1bmRhbmNlIGJpYXMuCgojIyBUaW1lIGludGVydmFscyA9IHN0cmF0aWdyYXBoaWMgYWdlIHVuY2VydGFpbnR5CiMjIyBNaW5pbXVtIGFuZCBtYXhpbXVtIHN0cmF0aWdyYXBoaWMgbGltaXRzCgpgYGB7ciBmaWcuaGVpZ2h0PTR9CmdncGxvdChjZXRhY2VhX3BiZGIsIGFlcyh4PXJlb3JkZXIobGF0ZV9pbnRlcnZhbCwgLW1heF9tYSwgbWVkaWFuKSwgZ3JvdXAgPSAtbWF4X21hLCBmaWxsPS1tYXhfbWEpKSArCiAgZ2VvbV9iYXIoc3RhdD0iY291bnQiKSArIAogIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJMYXRlIFN0cmF0aWdyYXBoaWMgTGltaXQiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgb2NjdXJyZW5jZXMiKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKG5hbWUgPSAiTWF4aW11bSBBZ2UgKE15KSIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2YgbWF4aW11bSBzdHJhdGlncmFwaGljIGFnZXMiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQoKZ2dwbG90KGNldGFjZWFfcGJkYiwgYWVzKHg9cmVvcmRlcihlYXJseV9pbnRlcnZhbCwgLW1pbl9tYSwgbWVkaWFuKSwgZ3JvdXAgPSAtbWluX21hLCBmaWxsPS1taW5fbWEpKSArCiAgZ2VvbV9iYXIoc3RhdD0iY291bnQiKSArIAogIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJFYXJseSBTdHJhdGlncmFwaGljIExpbWl0IikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIG9jY3VycmVuY2VzIikgKwogIHNjYWxlX2ZpbGxfY29udGludW91cyhuYW1lID0gIk1pbmltdW0gQWdlIChNeSkiKSArCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9uIG9mIG1pbmltdW0gc3RyYXRpZ3JhcGhpYyBhZ2VzIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKYGBgCgokXHRvJCBNb3N0IHNwZWNpZXMgaGF2ZSBhIGVhcmx5IGJ1dCBub3QgYSBsYXRlIHN0cmF0aWdyYXBoaWMgbGltaXQuCgojIyMgTWluaW11bSBhbmQgbWF4aW11bSBhZ2VzCgpgYGB7ciB9CiMgR2V0IHRoZSBzdHJhdGlncmFwaGljIGludGVydmFsIG9mIHRpbWUgdW5jZXJ0YWludHkKQ2V0YWNlYV9vY2MkYWdlX2ludGVydmFsIDwtIG1hcHBseShmdW5jdGlvbihtaW5fYWdlLCBtYXhfYWdlKXtwYXN0ZSgiWyIsLW1heF9hZ2UsIiwgIiwtbWluX2FnZSwiXSIsIHNlcCA9ICIiKX0sIENldGFjZWFfb2NjJG1pbl9tYSwgQ2V0YWNlYV9vY2MkbWF4X21hKQoKZ2dwbG90KENldGFjZWFfb2NjLCBhZXMoeD0tbWF4X21hLCB5PWFnZV9pbnRlcnZhbCkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21hLCB5ID0gcmVvcmRlcihhZ2VfaW50ZXJ2YWwsIC1hZ2VfbWVhbiksIHhlbmQgPSAtbWluX21hLCB5ZW5kPXJlb3JkZXIoYWdlX2ludGVydmFsLCAtYWdlX21lYW4pLCBjb2xvcj0tYWdlX21lYW4pKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBZ2UgaW50ZXJ2YWxzIikgKwogIGxhYnMoY29sb3VyPSJNZWFuIGFnZSIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2YgYWdlIGludGVydmFscyIpICsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMgVGltZSByYW5nZXMgPSBkdXJhdGlvbiBvZiB0aGUgdGltZSBpbnRlcnZhbHMKIyMjIENvdW50IG9jY3VycmVuY2VzIGJ5IGFjY2VwdGVkIG5hbWUKCmBgYHtyIGZpZy5oZWlnaHQ9OH0KIyBDb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZQpDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lLCBmdW5jdGlvbih4KXt0YWJsZShDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lKVt4XX0pCgpteV9icmVha3MgPC0gYygxLDMsMTAsMzUsMTAwLG1heChDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lX2NvdW50KSkKCmdncGxvdChDZXRhY2VhX29jY1shKENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiwgImZhbWlseSIpKSxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjMpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkFjY2VwdGVkIHJhbmtzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMsIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIHhlbmQgPSAtbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC4zKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBZ2UgcmFuZ2VzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MikpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMgKHNwZWNpZXMpIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09ImdlbnVzIixdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjMpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkdlbnVzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9NikpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMgKGdlbmVyYSkiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZmFtaWx5IixdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjMpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkdlbnVzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMgKGZhbWlsaWVzKSIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCmBgYAoKJFx0byQgU29tZSBvY2N1cnJlbmNlcyBoYXZlIHRvbyBtdWNoIGFnZSB1bmNlcnRhaW50eSwgdGhleSByaXNrIHRvIGFydGlmaWNpYWxseSBpbmNyZWFzZSBzcGVjaWVzIGR1cmF0aW9ucy4KCiMjIyBSZW1vdmUgb2NjdXJyZW5jZXMgd2l0aCBoaWdobHkgdW5jZXJ0YWluIGRhdGluZyAocmFuZ2UgPiAxME15KQoKYGBge3J9CiMgR2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgdGltZSBpbnRlcnZhbHMKQ2V0YWNlYV9vY2MkYWdlX3JhbmdlIDwtIENldGFjZWFfb2NjJG1heF9tYS1DZXRhY2VhX29jYyRtaW5fbWEKIyBPY2N1cnJlbmNlcyB3aG9zZSB0aW1lIHJhbmdlIGlzIGxvd2VyIHRoYW4gOCBtaWxsaW9uIHllYXJzCmRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSkKCmdncGxvdChDZXRhY2VhX29jYywgYWVzKHg9YWdlX3JhbmdlLCBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIHVuY2VydGFpbnR5IHJhbmdlIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgb2NjdXJyZW5jZXMiKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gOS41LCB5ID0gMCwgeGVuZCA9IDkuNSwgeWVuZD0xMDUwKSwgY29sb3I9ImJsYWNrIiwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2Ygb2NjdXJyZW5jZXMnIGFnZSB1bmNlcnRhaW50eSByYW5nZSIpCmBgYAoKTW9zdCBvZiBvY2N1cnJlbmNlcyBzaG93IGxlc3MgdGhhbiAxMCBNeSBhZ2UgdW5jZXJ0YWludHksIGxldCdzIHRyeSB0byBrZWVwIG9ubHkgdGhlc2Ugb25lcy4KCmBgYHtyfQpkYXRhLmZyYW1lKGFsbF9yYW5nZXMgPSBkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgIHNtYWxsZXJfMTBNeSA9IGRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSlbMV0sCiAgICAgICAgICAgcmVtb3ZlZCA9IGRpbShDZXRhY2VhX29jYylbMV0tZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdKVsxXSwgcm93Lm5hbWVzID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyIpCmBgYAoKYGBge3IgZmlnLmhlaWdodD02fQpnZ3Bsb3QoQ2V0YWNlYV9vY2MsIGFlcyh4PWFnZV9ydW5pZiwgeT1hZ2VfcmFuZ2UpKSArCiAgZ2VvbV9wb2ludChhbHBoYT0wLjA1KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVW5pZm9ybWx5IGRyYXduIGFnZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFnZSB1bmNlcnRhaW50eSByYW5nZSAoTXkpIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBvY2N1cnJlbmNlcycgYWdlIHVuY2VydGFpbnR5IHJhbmdlIikKCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhZ2VfcmFuZ2UgIT0gNjMuNDEyLF0sIGFlcyh4PWFnZV9ydW5pZiwgeT1hZ2VfcmFuZ2UpKSArCiAgZ2VvbV9wb2ludChhbHBoYT0wLjA1KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVW5pZm9ybWx5IGRyYXduIGFnZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFnZSB1bmNlcnRhaW50eSByYW5nZSAoTXkpIikgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IDAsIHkgPSAxMCwgeGVuZD02MCwgeWVuZCA9IDEwKSwgY29sb3I9ImJsYWNrIiwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2Ygb2NjdXJyZW5jZXMnIGFnZSB1bmNlcnRhaW50eSByYW5nZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0sIGFlcyh4PWFnZV9ydW5pZiwgeT1hZ2VfcmFuZ2UpKSArCiAgZ2VvbV9wb2ludChhbHBoYT0wLjA1KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVW5pZm9ybWx5IGRyYXduIGFnZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFnZSB1bmNlcnRhaW50eSByYW5nZSAoTXkpIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBvY2N1cnJlbmNlcycgYWdlIHVuY2VydGFpbnR5IHJhbmdlIikKCmhpc3QoLUNldGFjZWFfb2NjJGFnZV9ydW5pZiwgYnJlYWtzID0gNTAsIGNvbD0icmVkIiwgcHJvYmFiaWxpdHk9VCwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIG9jY3VycmVuY2VzLCB3aXRoIChyZWQpIG9mIHdpdGhvdXQgKGJsdWUpIHJlY2VudCBzYW1wbGVzIiwgeGxhYiA9ICJUaW1lIChNeSkiLCB5bGFiID0gIlByb3BvcnRpb24gb2Ygb2NjdXJyZW5jZXMiKQpoaXN0KC1DZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSRhZ2VfcnVuaWYsIGJyZWFrcyA9IDUwLCBjb2w9ImJsdWUiLCBwcm9iYWJpbGl0eT1ULCBkZW5zaXR5PVQsIGFkZD1UKQpgYGAKCiRcdG8kIFRoZSByZW1vdmFsIG9mIGhpZ2hseSB1bmNlcnRhaW4gb2NjdXJyZW5jZXMgc2VlbXMgdG8gYmUgb25seSBhIGxpdHRsZSBiaWFzZWQsIGV2ZW4gaWYgdW5jZXJ0YWludHkgZ2xvYmFsbHkgaW5jcmVhc2VzIHdpdGggYWdlLgoKYGBge3IgZmlnLmhlaWdodD04fQpteV9icmVha3MgPC0gYygxLDMsMTAsMzUsMTAwLG1heChDZXRhY2VhX29jYyRhY2NlcHRlZF9uYW1lX2NvdW50KSkKCmdncGxvdChDZXRhY2VhX29jY1shKENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiwgImZhbWlseSIpKSAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkFjY2VwdGVkIHJhbmtzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMsIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfbWVhbiksIHhlbmQgPSAtbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJBZ2UgcmFuZ2VzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MikpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMgKHNwZWNpZXMpIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09ImdlbnVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkdlbnVzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9NikpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMgKGdlbmVyYSkiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZmFtaWx5IiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSwgeGVuZCA9IC1taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkdlbnVzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGFnZSByYW5nZXMgKGZhbWlsaWVzKSIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCmBgYAoKJFx0byQgU29tZSBzcGVjaWVzIChvciBvdGhlciByYW5rcykgaGF2ZSBzZXZlcmFsIG9jY3VycmVuY2VzIHdpdGggc2V2ZXJhbCB0aW1lIHJhbmdlcywgKipsZXQncyBjb21iaW5lIHRoZW0gaW50byBhIHVuaXF1ZSByYW5nZSBjb3ZlcmluZyBhbGwgdGhlIG90aGVycyoqLgoKIyMgQ29tYmluZWQgdGltZSByYW5nZXMgPSB1bmlxdWUgdGltZSByYW5nZSBmb3Igb2NjdXJyZW5jZXMgd2l0aCB0aGUgc2FtZSBuYW1lICh3aXRob3V0IHRoZSBiaWdnZXN0IG9uZXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTgsIHdhcm5pbmc9RkFMU0V9CiMgR2V0IHRoZSBtaW5pbXVuIG9mIHRoZSBtaW5pbWFsIGFnZXMgZm9yIGVhY2ggYWNjZXB0ZWQgbmFtZQpDZXRhY2VhX29jYyRtaW5fbWluX21hIDwtIGFwcGx5KENldGFjZWFfb2NjLCAxLCBmdW5jdGlvbihYKXttaW4oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0kbWluX21hKX0pCiMgR2V0IHRoZSBtYXhpbXVtIG9mIHRoZSBtYXhpbWFsIGFnZXMgZm9yIGVhY2ggYWNjZXB0ZWQgbmFtZQpDZXRhY2VhX29jYyRtYXhfbWF4X21hIDwtIGFwcGx5KENldGFjZWFfb2NjLCAxLCBmdW5jdGlvbihYKXttYXgoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0kbWF4X21hKX0pCiMgR2V0IHRoZSBjb21iaW5lZCB0aW1lIGludGVydmFsCkNldGFjZWFfb2NjJGFnZV9jb21iaW5lZF9pbnRlcnZhbCA8LSBtYXBwbHkoZnVuY3Rpb24obWluX21pbl9hZ2UsIG1heF9tYXhfYWdlKXtwYXN0ZSgiWyIsLW1heF9tYXhfYWdlLCIsICIsLW1pbl9taW5fYWdlLCJdIiwgc2VwID0gIiIpfSwgQ2V0YWNlYV9vY2MkbWluX21pbl9tYSwgQ2V0YWNlYV9vY2MkbWF4X21heF9tYSkKIyBHZXQgdGhlIGNvbWJpbmVkIHRpbWUgaW50ZXJ2YWwgbWVhbgpDZXRhY2VhX29jYyRhZ2VfY29tYmluZWRfbWVhbiA8LSAoQ2V0YWNlYV9vY2MkbWluX21pbl9tYSArIENldGFjZWFfb2NjJG1heF9tYXhfbWEpLzIKIyBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb21iaW5lZCB0aW1lIGludGVydmFscwpDZXRhY2VhX29jYyRhZ2VfY29tYmluZWRfcmFuZ2UgPC0gQ2V0YWNlYV9vY2MkbWF4X21heF9tYS1DZXRhY2VhX29jYyRtaW5fbWluX21hCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbIShDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIsICJmYW1pbHkiKSkgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX2NvbWJpbmVkX21lYW4pLCB4ZW5kID0gLW1pbl9taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX2NvbWJpbmVkX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkFjY2VwdGVkIHJhbmtzIikgKwogIGxhYnMoY29sb3VyPSJBY2NlcHRlZCBuYW1lcyBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9bXlfYnJlYWtzLCBsYWJlbHM9bXlfYnJlYWtzKSArIAogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgZm9zc2lsIGNvbWJpbmVkIGFnZSByYW5nZXMsIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSwgYWVzKHg9LW1heF9tYSwgeT1hY2NlcHRlZF9uYW1lKSkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IC1tYXhfbWF4X21hLCB5ID0gcmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX2NvbWJpbmVkX21lYW4pLCB4ZW5kID0gLW1pbl9taW5fbWEsIHllbmQ9cmVvcmRlcihhY2NlcHRlZF9uYW1lLCAtYWdlX2NvbWJpbmVkX21lYW4pLCBjb2xvcj1hY2NlcHRlZF9uYW1lX2NvdW50KSwgYXJyb3c9YXJyb3coZW5kcyA9ICJib3RoIiwgYW5nbGU9OTAsIGxlbmd0aCA9IHVuaXQoMSwgIm1tIikpLCBhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4PS1hZ2VfcnVuaWYpLCBjb2w9InJlZCIsIGNleD0xLCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIkFnZSByYW5nZXMiKSArCiAgbGFicyhjb2xvdXI9IkFjY2VwdGVkIG5hbWVzIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0yKSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBmb3NzaWwgY29tYmluZWQgYWdlIHJhbmdlcyAoc3BlY2llcykiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0iZ2VudXMiICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgeGVuZCA9IC1taW5fbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJHZW5lcmEiKSArCiAgbGFicyhjb2xvdXI9IkFjY2VwdGVkIG5hbWVzIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT02KSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gYygiZGFya2JsdWUiLCAiZm9yZXN0Z3JlZW4iLCAiYmxhY2siKSwgdHJhbnM9ImxvZyIsIGJyZWFrcz1teV9icmVha3MsIGxhYmVscz1teV9icmVha3MpICsgCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBmb3NzaWwgY29tYmluZWQgYWdlIHJhbmdlcyAoZ2VuZXJhKSIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJmYW1pbHkiICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0sIGFlcyh4PS1tYXhfbWEsIHk9YWNjZXB0ZWRfbmFtZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtbWF4X21heF9tYSwgeSA9IHJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgeGVuZCA9IC1taW5fbWluX21hLCB5ZW5kPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9jb21iaW5lZF9tZWFuKSwgY29sb3I9YWNjZXB0ZWRfbmFtZV9jb3VudCksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MSwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9ICJGYW1pbGllcyIpICsKICBsYWJzKGNvbG91cj0iQWNjZXB0ZWQgbmFtZXMgY291bnQiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPW15X2JyZWFrcywgbGFiZWxzPW15X2JyZWFrcykgKyAKICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIGZvc3NpbCBjb21iaW5lZCBhZ2UgcmFuZ2VzIChmYW1pbGllcykiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiMjIE9jY3VycmVuY2UgZGVuc2l0eQojIyMgRGVuc2l0eSBkaXN0cmlidXRpb25zCgpgYGB7ciBmaWcuaGVpZ2h0PTZ9CiMgR2V0IGludGVydmFsIGRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMKQ2V0YWNlYV9vY2Mkb2NjdXJyZW5jZV9kZW5zaXR5IDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX25hbWVfY291bnQvQ2V0YWNlYV9vY2MkYWdlX3JhbmdlCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbIShDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3Vic3BlY2llcyIsICJpbmZyYW9yZGVyIikpICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwLF0sIGFlcyh4PW9jY3VycmVuY2VfZGVuc2l0eSwgZmlsbD1mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCBuYW1lIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2NjdXJyZW5jZSBkZW5zaXR5LCBieSBhY2NlcHRlZCByYW5rIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKYGBgCgokXHRvJCBEZW5zaXR5IGxvZ2ljYWxseSBpbmNyZWFzZXMgYXMgdGF4YSByYW5rcyBpbmNyZWFzZS4KCiMjIENvcnJlbGF0aW9uIGJldHdlZW4gdGltZSByYW5nZSBhbmQgYWdlCgpJZiB3ZSB3YW50IHRvIGNvcnJlY3Qgc3BlY2llcyBhYnVuZGFuY2UgZGlmZmVyZW5jZXMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBpbiB0aGUgdGltZSByYW5nZSAoImRlbnNpdHkiKSwgdGhvc2UgZmFjdG9ycyBzaG91bGQgbm90IGRlcGVuZCBvbiB0aW1lIGluIG9yZGVyIHRvIGF2b2lkIHBlbmFsaXppbmcgcGVyaW9kcyB3aXRoIGhpZ2hlciBkZW5zaXRpZXMuCgpgYGB7cn0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwCgojIEtlZXAgb25seSBvbmUgcG9pbnQgYnkgaWRlbnRpY2FsIHRpbWUgaW50ZXJ2YWwKCmFnZV9pbnRlcnZhbF90YWJsZSA8LSB0YWJsZShDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX2ludGVydmFsKQoKaW50ZXJ2YWxfbWVhbl9hZ2UgPC0gc2FwcGx5KG5hbWVzKGFnZV9pbnRlcnZhbF90YWJsZSksIGZ1bmN0aW9uKHgpe0NldGFjZWFfb2NjW2NvbmRpdGlvbnMgJiBDZXRhY2VhX29jYyRhZ2VfaW50ZXJ2YWw9PXgsXSRhZ2VfbWVhblsxXX0pCgppbnRlcnZhbF9yYW5nZSA8LSBzYXBwbHkobmFtZXMoYWdlX2ludGVydmFsX3RhYmxlKSwgZnVuY3Rpb24oeCl7Q2V0YWNlYV9vY2NbY29uZGl0aW9ucyAmIENldGFjZWFfb2NjJGFnZV9pbnRlcnZhbD09eCxdJGFnZV9yYW5nZVsxXX0pCgpkZiA8LSBkYXRhLmZyYW1lKHg9aW50ZXJ2YWxfbWVhbl9hZ2UsCiAgICAgICAgICAgICAgICAgeT1pbnRlcnZhbF9yYW5nZSkKCmdncGxvdChkZiwgYWVzKHg9eCwgeT15KSkgKyAKICBnZW9tX3BvaW50KGFscGhhPTAuNSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSB5fngsIHNwYW4gPSAwLjksIG1ldGhvZCA9ICdsb2VzcycpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiVW5jZXJ0YWludHkgcmFuZ2UiKSArCiAgZ2d0aXRsZSgiU21vb3RoZWQgY29ycmVzcG9uZGFuY2UgYmV0d2VlbiB0aW1lIHJhbmdlIGFuZCBhZ2UiKQoKIyBLZWVwIG9ubHkgb25lIHBvaW50IGJ5IGlkZW50aWNhbCBjb21iaW5lZCB0aW1lIGludGVydmFsCmFnZV9jb21iaW5lZF9pbnRlcnZhbF90YWJsZSA8LSB0YWJsZShDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX2NvbWJpbmVkX2ludGVydmFsKQoKY29tYmluZWRfaW50ZXJ2YWxfbWVhbl9hZ2UgPC0gc2FwcGx5KG5hbWVzKGFnZV9jb21iaW5lZF9pbnRlcnZhbF90YWJsZSksIGZ1bmN0aW9uKHgpe0NldGFjZWFfb2NjW2NvbmRpdGlvbnMgJiBDZXRhY2VhX29jYyRhZ2VfY29tYmluZWRfaW50ZXJ2YWw9PXgsXSRhZ2VfY29tYmluZWRfbWVhblsxXX0pCgpjb21iaW5lZF9pbnRlcnZhbF9yYW5nZSA8LSBzYXBwbHkobmFtZXMoYWdlX2NvbWJpbmVkX2ludGVydmFsX3RhYmxlKSwgZnVuY3Rpb24oeCl7Q2V0YWNlYV9vY2NbY29uZGl0aW9ucyAmIENldGFjZWFfb2NjJGFnZV9jb21iaW5lZF9pbnRlcnZhbD09eCxdJGFnZV9jb21iaW5lZF9yYW5nZVsxXX0pCgpjb21iaW5lZF9kZiA8LSBkYXRhLmZyYW1lKHg9Y29tYmluZWRfaW50ZXJ2YWxfbWVhbl9hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeT1jb21iaW5lZF9pbnRlcnZhbF9yYW5nZSkKCmdncGxvdChjb21iaW5lZF9kZiwgYWVzKHg9eCwgeT15KSkgKyAKICBnZW9tX3BvaW50KGFscGhhPTAuNSkgKwogIGdlb21fc21vb3RoKGZvcm11bGEgPSB5fngsIHNwYW4gPSAwLjksIG1ldGhvZCA9ICdsb2VzcycpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkNvbWJpbmVkIHVuY2VydGFpbnR5IHJhbmdlIikgKwogIGdndGl0bGUoIlNtb290aGVkIGNvcnJlc3BvbmRhbmNlIGJldHdlZW4gY29tYmluZWQgdGltZSByYW5nZSBhbmQgYWdlIikKYGBgCgokXHRvJCBJdCBzZWVtcyB0aGF0IGFnZSByYW5nZSB2YXJpZXMgaW1wb3J0YW50bHkgd2l0aCB0aW1lLCBidXQgd2hlbiB0YWtpbmcgdGhlIGZ1bGwgY29tYmluZWQgcmFuZ2UgaW50byBhY2NvdW50IHRoZSBjb3JyZWxhdGlvbiBzZWVtcyBxdWl0ZSB3ZWFrIGFmdGVyIHRoZSBmaXJzdCBtaWxsaW9uIHllYXJzLgoKTGV0J3MgbG9vayBhdCB0aGUgZGVuc2l0eSBkaXJlY3RseSwgYmVjYXVzZSB0aGlzIGlzIHdoYXQgaXMgaW50ZXJlc3RpbmcgdXMgZGlyZWN0bHkuCgpgYGB7cn0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwCgojIEZ1bmN0aW9uIHRvIHBsb3QgbGluZWFyIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzCmxtX2VxbiA8LSBmdW5jdGlvbihkZil7CiAgICBtIDwtIGxtKHkgfiB4LCBkZik7CiAgICBlcSA8LSBzdWJzdGl0dXRlKGl0YWxpYyh5KSA9PSBhICsgYiAlLiUgaXRhbGljKHgpKiIsIn5+aXRhbGljKHIpXjJ+Ij0ifnIyLCAKICAgICAgICAgbGlzdChhID0gZm9ybWF0KHVubmFtZShjb2VmKG0pWzFdKSwgZGlnaXRzID0gMiksCiAgICAgICAgICAgICAgYiA9IGZvcm1hdCh1bm5hbWUoY29lZihtKVsyXSksIGRpZ2l0cyA9IDIpLAogICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkKICAgIGFzLmNoYXJhY3Rlcihhcy5leHByZXNzaW9uKGVxKSk7Cn0KCiMgS2VlcCBvbmx5IG9uZSBwb2ludCBieSBpZGVudGljYWwgdGltZSBpbnRlcnZhbAphZ2VfaW50ZXJ2YWxfdGFibGUgPC0gdGFibGUoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9pbnRlcnZhbCkKCmludGVydmFsX21lYW5fYWdlIDwtIHNhcHBseShuYW1lcyhhZ2VfaW50ZXJ2YWxfdGFibGUpLCBmdW5jdGlvbih4KXtDZXRhY2VhX29jY1tjb25kaXRpb25zICYgQ2V0YWNlYV9vY2MkYWdlX2ludGVydmFsPT14LF0kYWdlX21lYW5bMV19KQoKaW50ZXJ2YWxfZGVuc2l0eSA8LSBzYXBwbHkobmFtZXMoYWdlX2ludGVydmFsX3RhYmxlKSwgZnVuY3Rpb24oeCl7Q2V0YWNlYV9vY2NbY29uZGl0aW9ucyAmIENldGFjZWFfb2NjJGFnZV9pbnRlcnZhbD09eCxdJG9jY3VycmVuY2VfZGVuc2l0eVsxXX0pCgpkZl9kZW5zaXR5IDwtIGRhdGEuZnJhbWUoeD1pbnRlcnZhbF9tZWFuX2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHk9aW50ZXJ2YWxfZGVuc2l0eSkKCmdncGxvdChkZl9kZW5zaXR5LCBhZXMoeD14LCB5PXkpKSArIAogIGdlb21fcG9pbnQoYWxwaGE9MC41KSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9IHl+eCwgbWV0aG9kPWxtKSArIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJDb21iaW5lZCBkZW5zaXR5IikgKwogIGdndGl0bGUoIkNvcnJlbGF0aW9uIGJldHdlZW4gZGVuc2l0eSBhbmQgYWdlIikgKwogIGdlb21fdGV4dCh4ID0gMzUsIHkgPSAyNSwgbGFiZWwgPSBsbV9lcW4oZGZfZGVuc2l0eSksIHBhcnNlID0gVFJVRSkKCiMgS2VlcCBvbmx5IG9uZSBwb2ludCBieSBpZGVudGljYWwgY29tYmluZWQgdGltZSBpbnRlcnZhbAphZ2VfY29tYmluZWRfaW50ZXJ2YWxfdGFibGUgPC0gdGFibGUoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9jb21iaW5lZF9pbnRlcnZhbCkKCmNvbWJpbmVkX2ludGVydmFsX21lYW5fYWdlIDwtIHNhcHBseShuYW1lcyhhZ2VfY29tYmluZWRfaW50ZXJ2YWxfdGFibGUpLCBmdW5jdGlvbih4KXtDZXRhY2VhX29jY1tjb25kaXRpb25zICYgQ2V0YWNlYV9vY2MkYWdlX2NvbWJpbmVkX2ludGVydmFsPT14LF0kYWdlX2NvbWJpbmVkX21lYW5bMV19KQoKQ2V0YWNlYV9vY2Mkb2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5IDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX25hbWVfY291bnQvQ2V0YWNlYV9vY2MkYWdlX2NvbWJpbmVkX3JhbmdlCgpjb21iaW5lZF9pbnRlcnZhbF9kZW5zaXR5IDwtIHNhcHBseShuYW1lcyhhZ2VfY29tYmluZWRfaW50ZXJ2YWxfdGFibGUpLCBmdW5jdGlvbih4KXtDZXRhY2VhX29jY1tjb25kaXRpb25zICYgQ2V0YWNlYV9vY2MkYWdlX2NvbWJpbmVkX2ludGVydmFsPT14LF0kb2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5WzFdfSkKCmNvbWJpbmVkX2RmX2RlbnNpdHkgPC0gZGF0YS5mcmFtZSh4PWNvbWJpbmVkX2ludGVydmFsX21lYW5fYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1jb21iaW5lZF9pbnRlcnZhbF9kZW5zaXR5KQoKZ2dwbG90KGNvbWJpbmVkX2RmX2RlbnNpdHksIGFlcyh4PXgsIHk9eSkpICsgCiAgZ2VvbV9wb2ludChhbHBoYT0wLjUpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0geX54LCBtZXRob2Q9bG0pICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkNvbWJpbmVkIGRlbnNpdHkiKSArCiAgZ2d0aXRsZSgiQ29ycmVsYXRpb24gYmV0d2VlbiBjb21iaW5lZCBkZW5zaXR5IGFuZCBhZ2UiKSArCiAgZ2VvbV90ZXh0KHggPSAxNSwgeSA9IDYsIGxhYmVsID0gbG1fZXFuKGNvbWJpbmVkX2RmX2RlbnNpdHkpLCBwYXJzZSA9IFRSVUUpCmBgYAoKJFx0byQgVGhlIGRlbnNpdHkgYmFzZWQgb24gY29tYmluZWQgcmFuZ2VzIGlzIG11Y2ggbGVzcyB0aW1lLWRlcGVuZGFudCB0aGFuIHRoZSBkZW5zaXR5IGJhc2VkIG9uIGluaXRpYWwgcmFuZ2UgYWdlcy4gV2Ugd2lsbCB0aGVyZWZvcmUgdXNlIHRoZSBjb21iaW5lZCBkZW5zaXR5IGZvciBvdXIgY29ycmVjdGlvbnMuCgojIyBTdWItc2FtcGxpbmcgb2Ygb2NjdXJyZW5jZXMgd2l0aCBhIG5vcm1hbGl6ZWQgZGVuc2l0eSBhbG9uZyB0aGUgY29tYmluZWQgcmFuZ2VzCiMjIyBDb21wYXJlIGRlbnNpdGllcyBmb3Igc2luZ2xlIHZzLiBjb21iaW5lZCByYW5nZXMuCgpgYGB7ciBmaWcuaGVpZ2h0PTZ9CmNvbmRpdGlvbnMgPC0gIShDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3Vic3BlY2llcyIsICJpbmZyYW9yZGVyIikpICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD1vY2N1cnJlbmNlX2RlbnNpdHksIGZpbGw9ZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMSkgKwogIHNjYWxlX3hfY29udGludW91cyh0cmFucz0ibG9nMTAiLCBuYW1lPSJEZW5zaXR5IG9mIG9jY3VycmVuY2VzIChudW1iZXIvTXkpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgbmFtZSBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb25zIG9mIG9jY3VycmVuY2UgZGVuc2l0eSwgYnkgYWNjZXB0ZWQgcmFuayIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD1vY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHksIGZpbGw9ZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9ImxvZzEwIiwgbmFtZT0iQ29tYmluZWQgZGVuc2l0eSBvZiBvY2N1cnJlbmNlcyAobnVtYmVyL015KSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIG5hbWUgY291bnQiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBvZiBjb21iaW5lZCBvY2N1cnJlbmNlIGRlbnNpdHksIGJ5IGFjY2VwdGVkIHJhbmsiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiRcdG8kIERlbnNpdGllcyBhcmUgc21hbGxlciBhbmQgbW9yZSBjb25jZW50cmF0ZWQgd2l0aCB0aGUgY29tYmluZWQgcmFuZ2VzIChsYXJnZXIgdGltZSBzcGFuICsgbGVzcyByYW5nZXMgaW4gdG90YWwgYmVjYXVzZSBvZiB0aGUgY29sbGVwc2VzIGludG8gdW5pcXVlIHJhbmdlcykuCgojIyMgQ29tcGFyZSBkZW5zaXRpZXMgYnkgYWNjZXB0ZWQgbmFtZSBjb3VudCAoc3BlY2llcyBvbmx5KQoKTGV0J3MgZm9jdXMgbm93IG9uIHRoZSBvY2N1cnJlbmNlcyBhY2NlcHRlZCBhdCB0aGUgc3BlY2llcyBsZXZlbCBiZWNhdXNlIHRoZXkgYXJlIHRoZSBvbmUgZm9yIHdoaWNoIHdlIGNhbiBjb3JyZWN0IHRoZSBhYnVuZGFuY2UgYmlhcyBieSBzdWJzYW1wbGluZyB0aGUgbW9zdCBjb25jZW50cmF0ZWQgY29tYmluZWQgaW50ZXJ2YWxzLgoKYGBge3IgZmlnLmhlaWdodD02fQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAKCmdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PW9jY3VycmVuY2VfZGVuc2l0eSwgZmlsbD1mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCBuYW1lIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2Ygb2NjdXJyZW5jZSBkZW5zaXR5IGFtb25nIHNwZWNpZXMiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9uYW1lX2NvdW50IH4gLiwgc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSwgYWVzKHg9b2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5LCBmaWxsPWZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0wLjA1KSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIsIG5hbWU9IkNvbWJpbmVkIGRlbnNpdHkgb2Ygb2NjdXJyZW5jZXMgKG51bWJlci9NeSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCBuYW1lIGNvdW50IikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2YgY29tYmluZWQgb2NjdXJyZW5jZSBkZW5zaXR5IGFtb25nIHNwZWNpZXMiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9uYW1lX2NvdW50IH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiRcdG8kIFRoZWlyIGlzIGEgaHVnZSBzcGFuIG9mIGRlbnNpdGllcyBkcml2ZW4gYnkgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBmb3IgdGhlIHNhbWUgc3BlY2llcyB0aGF0IHdlIGNhbiByZWR1Y2UgYnkgc3Vic2FtcGxpbmcgdGhlIG1vc3QgY29uY2VudHJhdGVkIGludGVydmFscy4KCiMjIyBJbXBhY3Qgb2YgY29ycmVjdGluZyBzdWJzYW1wbGluZyBvbiBkZW5zaXR5IGRpc3RyaWJ1dGlvbnMgKHNwZWNpZXMgb25seSkKCmBgYHtyIGZpZy5oZWlnaHQ9Nn0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2MkYWdlX3JhbmdlPDEwCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD1vY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHksIGZpbGw9ZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9ImxvZzEwIiwgbmFtZT0iQ29tYmluZWQgZGVuc2l0eSBvZiBvY2N1cnJlbmNlcyAobnVtYmVyL015KSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIG5hbWUgY291bnQiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZShwYXN0ZSgiRGlzdHJpYnV0aW9ucyBvZiBjb21iaW5lZCBvY2N1cnJlbmNlIGRlbnNpdHkgYW1vbmcgc3BlY2llcyAobiA9ICIsIGRpbShDZXRhY2VhX29jY1tjb25kaXRpb25zLF0pWzFdLCAiKSIsIHNlcD0iIikpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX25hbWVfY291bnQgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgojIEFkZCBhdCBsZWFzdCBvbmUgb2NjdXJyZW5jZSBvZiBlYWNoIHNwZWNpZXMKQ2V0YWNlYV9vY2Nfc2FtcGxlZCA8LSBjKCkKQ2V0YWNlYV9vY2Nfbm90c2FtcGxlZCA8LSBjKCkKZm9yIChpIGluIGFzLm51bWVyaWMocm93Lm5hbWVzKENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSkpKXsKICByb3cgPC0gQ2V0YWNlYV9vY2NbYXMuY2hhcmFjdGVyKGkpLF0KICBpZiAoIShyb3ckYWNjZXB0ZWRfbmFtZSAlaW4lIENldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZSkpewogICAgQ2V0YWNlYV9vY2Nfc2FtcGxlZCA8LSByYmluZChDZXRhY2VhX29jY19zYW1wbGVkLCByb3cpCiAgfWVsc2V7CiAgICBDZXRhY2VhX29jY19ub3RzYW1wbGVkIDwtIHJiaW5kKENldGFjZWFfb2NjX25vdHNhbXBsZWQsIHJvdykKICB9Cn0KCiMgQWRkIG9jY3VycmVuY2VzIGluIHRoZSByZW1hbmluZyBvbmVzLCBieSB1bmRlcndlaWdodGluZyBkZW5zZSBzcGVjaWVzCkNldGFjZWFfb2NjX3NhbXBsZWQgPC0gcmJpbmQoQ2V0YWNlYV9vY2Nfc2FtcGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX24oQ2V0YWNlYV9vY2Nfbm90c2FtcGxlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9ODAwLWRpbShDZXRhY2VhX29jY19zYW1wbGVkKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0PTEvQ2V0YWNlYV9vY2Nfbm90c2FtcGxlZCRvY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHkqKjMpKQoKQ2V0YWNlYV9vY2Nfc2FtcGxlZCRtaW5fbWluX21hIDwtIGFwcGx5KENldGFjZWFfb2NjX3NhbXBsZWQsIDEsIGZ1bmN0aW9uKFgpe21pbihDZXRhY2VhX29jY19zYW1wbGVkW0NldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZT09WFsiYWNjZXB0ZWRfbmFtZSJdLF0kbWluX21hKX0pCkNldGFjZWFfb2NjX3NhbXBsZWQkbWF4X21heF9tYSA8LSBhcHBseShDZXRhY2VhX29jY19zYW1wbGVkLCAxLCBmdW5jdGlvbihYKXttYXgoQ2V0YWNlYV9vY2Nfc2FtcGxlZFtDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX25hbWU9PVhbImFjY2VwdGVkX25hbWUiXSxdJG1heF9tYSl9KQpDZXRhY2VhX29jY19zYW1wbGVkJGFnZV9jb21iaW5lZF9yYW5nZSA8LSBDZXRhY2VhX29jY19zYW1wbGVkJG1heF9tYXhfbWEtQ2V0YWNlYV9vY2Nfc2FtcGxlZCRtaW5fbWluX21hCkNldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZV9jb3VudCA8LSBzYXBwbHkoQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9uYW1lLCBmdW5jdGlvbih4KXt0YWJsZShDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX25hbWUpW3hdfSkKQ2V0YWNlYV9vY2Nfc2FtcGxlZCRvY2N1cnJlbmNlX2NvbWJpbmVkX2RlbnNpdHkgPC0gQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9uYW1lX2NvdW50L0NldGFjZWFfb2NjX3NhbXBsZWQkYWdlX2NvbWJpbmVkX3JhbmdlCgoKZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSwgZmlsbD1mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4wNSkgKwogIHNjYWxlX3hfY29udGludW91cyh0cmFucz0ibG9nMTAiLCBuYW1lPSJDb21iaW5lZCBkZW5zaXR5IG9mIG9jY3VycmVuY2VzIChudW1iZXIvTXkpIiwgbGltaXRzPWMoMC4xLCAxMDAwKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgbmFtZSBjb3VudCIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb25zIG9mIGNvbWJpbmVkIG9jY3VycmVuY2UgZGVuc2l0eSBhbW9uZyBzcGVjaWVzLCBhZnRlciBzYW1wbGluZyAobiA9ICIsIGRpbShDZXRhY2VhX29jY19zYW1wbGVkKVsxXSwgIikiLCBzZXA9IiIpKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9uYW1lX2NvdW50IH4gLiwgc2NhbGVzID0gImZyZWUiKQpgYGAKCiRcdG8kIFN1YnNhbXBsaW5nIHN1Y2Nlc3NmdWxseSByZWR1Y2VzIHRoZSBkZW5zaXR5IHNwYW4gZnJvbSAyIHRvIDEgb3JkZXIgb2YgbWFnbml0dWRlLgoKIyMjIEltcGFjdCBvZiBzdWJzYW1wbGluZyBvbiBvY2N1cnJlbmNlcyByZXBhcnRpdGlvbiAoc3BlY2llcyBvbmx5KQoKU2VlIHdoYXQgb3VyIGRpc3RyaWJ1dGlvbnMgbG9vb2sgbGlrZSBhZnRlciBzdWJzYW1wbGluZyA6CgpgYGB7ciBmaWcuaGVpZ2h0PTV9CmJyZWFrcyA8LSBjKDAuMTI1LDAuMjUsMC41LDEsMiw0LDgsMTYpCgpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIHhlbmQgPSAtbWluX21pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIGNvbG9yPW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MC41LCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMiKSArCiAgbGFicyhjb2xvdXI9Ik9jY3VycmVuY2VcbmRlbnNpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPWJyZWFrcywgbGFiZWxzPWJyZWFrcykgKyAKICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb25zIG9mIHNwZWNpZXMgZm9zc2lsIGFnZSByYW5nZXMsIGJlZm9yZSBjb3JyZWN0aW5nIHNhbXBsaW5nIChuID0gIiwgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAsXSlbMV0sICIpIiwgc2VwPSIiKSkKCmdncGxvdChDZXRhY2VhX29jY19zYW1wbGVkLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIHhlbmQgPSAtbWluX21pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIGNvbG9yPW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MC41LCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMiKSArCiAgbGFicyhjb2xvdXI9Ik9jY3VycmVuY2VcbmRlbnNpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCJkYXJrYmx1ZSIsICJmb3Jlc3RncmVlbiIsICJibGFjayIpLCB0cmFucz0ibG9nIiwgYnJlYWtzPWJyZWFrcywgbGFiZWxzPWJyZWFrcykgKyAKICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb25zIG9mIHNwZWNpZXMgZm9zc2lsIGFnZSByYW5nZXMsIGFmdGVyIGNvcnJlY3Rpbmcgc2FtcGxpbmcgKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2Nfc2FtcGxlZClbMV0sICIpIiwgc2VwPSIiKSkKYGBgCgokXHRvJCBTb21lIGhpZ2hseSBkZW5zZSBjbHVzdGVyIGJlY2FtZSBtdWNoIG1vcmUgc2ltaWxhciB0byB0aGUgb3RoZXJzLgoKYGBge3IgZmlnLmhlaWdodD01fQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAKCmdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0icmVkIikgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUocGFzdGUoIkV2b2x1dGlvbiBvZiB0aGUgc3BlY2llcyBvY2N1cnJlbmNlIG51bWJlciB0aHJvdWdoIHRpbWUgKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdKVsxXSwgIikiLCBzZXA9IiIpKQoKZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iYmx1ZSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJFdm9sdXRpb24gb2YgdGhlIHNwZWNpZXMgb2NjdXJyZW5jZSBudW1iZXIgdGhyb3VnaCB0aW1lLCBhZnRlciBjb3JyZWN0aW9uIHNhbXBsaW5nIChuID0gIiwgZGltKENldGFjZWFfb2NjX3NhbXBsZWQpWzFdLCAiKSIsIHNlcD0iIikpCmBgYAoKSWYgd2Ugc3VwZXJwb3NlIHRoZXNlIDIgcGxvdHMgOgoKYGBge3IgZmlnLmhlaWdodD01fQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIgJiBDZXRhY2VhX29jYyRhZ2VfcmFuZ2U8MTAKCnAxIDwtIGdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0icmVkIikgKwogIHRoZW1lX3ZvaWQoKQoKcDIgPC0gZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iYmx1ZSIpICsKICB0aGVtZV92b2lkKCkKCnAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMikpCmBgYAoKJFx0byQgV2UgZ2V0IHRoZSBuZXcgc3BlY2llcyBvY2N1cnJlbmNlIHJlcGFydGl0aW9uIGFmdGVyIHN1YnNhbXBsaW5nIGNvcnJlY3Rpb24sIHRoYXQgY291bGQgYmUgdXNlZCBmb3IgZG9pbmcgaW5mZXJlbmNlIHdpdGggdGhlIG9jY3VycmVuY2UgYmlydGgtZGVhdGggbW9kZWwuCgojIE5ldyBkZXZlbG9wbWVudHMKCiMjIENvbXBhcmUgd2l0aCBhIFBvaXNzb24gc2FtcGxpbmcgcHJvY2VzcwoKSW4gb3JkZXIgdG8gY2hlY2sgaWYgdGhlIGRhdGEgZml0IG91ciBhc3N1bXB0aW9ucyBvZiBjb25zdGFudC1mb3NzaWxpc2F0aW9uLXJhdGUgUG9pc3NvbiBzYW1wbGluZyB3ZSBjb21wYXJlIHRoZSBvYnNlcnZlZCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb25zIHdpdGggdGhlIGV4cGVjdGVkIG9uZXMuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBsb29rIGF0IHRoZSBudW1iZXIgb2YgdGF4YSByZXByZXNlbnRlZCBieSAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgYW5kIHRoZSBvbmUgdGhhdCB3ZSB3b3VsZCBleHBlY3QgZm9yIGEgZ2l2ZW4gZGlzdHJpYnV0aW9uIG9mIGNvbWJpbmVkIGFnZSByYW5nZXMgKGFzIGEgcHJveHkgZm9yIHNwZWNpZXMgZHVyYXRpb24pLgoKYGBge3IgZmlnLmhlaWdodD02fQpjb25kaXRpb25zIDwtICEoQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayAlaW4lIGMoInN1YnNwZWNpZXMiLCAiaW5mcmFvcmRlciIpKSAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMAoKZ2dwbG90KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSwgYWVzKHg9YWdlX2NvbWJpbmVkX3JhbmdlLCBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArIAogICNnZW9tX3BvaW50KCkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkFnZSByYW5nZSAoTXkpIikgKwogICNzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIkNvdW50IChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgZ2d0aXRsZSgiT2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBjb21iaW5lZCBhZ2UgcmFuZ2VzIikgKwogIGZhY2V0X2dyaWQoLiB+IGFjY2VwdGVkX3JhbmssIHNjYWxlcyA9ICJmcmVlIikKCmdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PWFjY2VwdGVkX25hbWVfY291bnQsIHk9KHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnQpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudCkpKSlbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpXSwgY29sPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiT2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiB0aGUgbnVtYmVyIG9mIGFjY2VwdGVkIG5hbWVzIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKYGBgCgpJbiBhIFBvaXNzb24gcHJvY2VzcyB3aXRoIG9jY3VycmVuY2Ugc2FtcGxpbmcgcmF0ZSAkXG9tZWdhJCBhbmQgZm9yIGEgZ2l2ZW4gdGltZSBpbnRlcnZhbCBvZiBsZW5ndGggJHQkLCB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nICROX3QgPSBrJCBvY2N1cnJlbmNlcyBpcyBnaXZlbiBieSB0aGUgUG9pc3NvbiBkaXN0cmlidXRpb24gb2YgbWVhbiBvZiBwYXJhbWV0ZXIgJFxvbWVnYVx0aW1lcyB0JCA6IAoKJCRcbWF0aGJie1B9KE5fdD1rKSA9IGVeey1cb21lZ2EgdH1cZnJhY3soXG9tZWdhIHQpXmt9e2shfSQkCgpTbyBpbiBvcmRlciB0byBoYXZlIHRoZSBhYnNvbHV0ZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgJE5fMCA9IG4kIG9jY3VycmVuY2VzIHdlIGhhdmUgdG8gaW50ZWdyYXRlIG92ZXIgdGhlIGZ1bGwgZGlzdHJpYnV0aW9uIG9mIGFnZSByYW5nZXMgJHQkLCBjYWxsZWQgJGYodCkkIDoKCiQkXG1hdGhiYntQfShOXzAgPSBuKSA9IFxpbnRfdCBQKE5fdCA9IG4pIGYodCkgZHQgPSBcaW50X3QgZV57LVxvbWVnYSB0fVxmcmFjeyhcb21lZ2EgdClebn17biF9IGYodCkgZHQkJAoKRmlyc3QsICBhcHByb3hpbWF0ZSB0aGlzIGRpc3RyaWJ1dGlvbiA6CgpgYGB7cn0KcmFuZ2VfZGVuc2l0eSA8LSBhcHByb3hmdW4oZGVuc2l0eShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhZ2VfY29tYmluZWRfcmFuZ2VbaXMuZmluaXRlKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSldKSkKCmhpc3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWdlX2NvbWJpbmVkX3JhbmdlLCBwcm9iYWJpbGl0eSA9IFQsIGJyZWFrcyA9IDIwLCBtYWluPSJEZW5zaXR5IGFwcHJveGltYXRpb24gb2YgdGhlIGVtcGlyaWNhbCByYW5nZSBkaXN0cmlidXRpb24iLCB4bGFiID0gIkFnZSByYW5nZSAoTXkpIikKbGluZXMoMToxMDAvNSwgcmFuZ2VfZGVuc2l0eSgxOjEwMC81KSkKYGBgCgpUaGVuIGludGVncmF0ZSBhbmQgcGxvdCB0aGUgZXhwZWN0ZWQgZGlzdHJpYnV0aW9uIGZvciBhIGdpdmVuIG9tZWdhIDoKCmBgYHtyfQpleHBlY3RlZF9kaXN0cmlidXRpb24gPC0gZnVuY3Rpb24obiwgb21lZ2EsIGFnZV9jb21iaW5lZF9yYW5nZSl7CiAgcmFuZ2VfZGVuc2l0eSA8LSBhcHByb3hmdW4oZGVuc2l0eShhZ2VfY29tYmluZWRfcmFuZ2VbaXMuZmluaXRlKGFnZV9jb21iaW5lZF9yYW5nZSldKSkKICBnIDwtIGZ1bmN0aW9uKHQpe2Rwb2lzKG4sIG9tZWdhKnQpKnJhbmdlX2RlbnNpdHkodCl9CiAgcmV0dXJuIChpbnRlZ3JhdGUoZywgbG93ZXIgPSAxLCB1cHBlciA9IG1heChhZ2VfY29tYmluZWRfcmFuZ2UpKSkKfQoKb21lZ2EgPC0gMC4xCgpkZW5zIDwtIHNhcHBseSgwOjIwLCBmdW5jdGlvbihuKXtleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWV9KQoKcGxvdCgwOjIwLCBkZW5zLCBtYWluPSJFeHBlY3RlZCBkaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBhY2NlcHRlZCBuYW1lcyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBvY2N1cnJlbmNlcyIsIHhsYWI9Ik51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUiLCB5bGFiID0gIlByb3BvcnRpb25zIiwgdHlwZSA9ICJiIikKYGBgCgpGaW5hbGx5LCB0cnkgdG8gZmluZCBhbiAkXG9tZWdhJCB2YWx1ZSB0aGF0IGFwcHJveGltYXRlbHkgZml0cyB0aGUgZmlyc3QgcG9pbnRzICh0aGUgbGVhc3QgYWZmZWN0ZWQgYnkgb3ZlcnNhbXBsaW5nIGJpYXNlcykgYW5kIGNoZWNrIGlmIHRoZSBvdGhlciBwb2ludHMgZm9sbG93IHRoZSBleHBlY3RlZCBjdXJ2ZSA6CgpgYGB7ciBmaWcuaGVpZ2h0PTZ9CiMgUmVjb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIHdpdGggdGhlIHNhbWUgYWNjZXB0ZWQgbmFtZSBhZnRlciB0aGUgc2FtcGxpbmcKQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShDZXRhY2VhX29jY19zYW1wbGVkJGFjY2VwdGVkX25hbWUsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjX3NhbXBsZWQkYWNjZXB0ZWRfbmFtZSlbeF19KQoKb21lZ2EgPC0gMC4xCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnMgPC0gc2FwcGx5KDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyksIGZ1bmN0aW9uKG4peyBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwoKIyBDb21wYXJlIHRoZSBpbml0aWFsIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0sCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LCAKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpLCB5PSBkZW5zCiAgICAqbWF4KGFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKV0pIC9tYXgoZGVucykpKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19zYW1wbGVkIDwtIENldGFjZWFfb2NjX3NhbXBsZWRbQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfc2FtcGxlZCA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX3NhbXBsZWQpLCBmdW5jdGlvbihuKXsKICAgICBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjX3NhbXBsZWRbQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhZ2VfY29tYmluZWRfcmFuZ2UpJHZhbHVlCiAgICB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfc2FtcGxlZCA8LSB0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfc2FtcGxlZCkvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfc2FtcGxlZCkpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCgojIENvbXBhcmUgdGhlIGNvcnJlY3RlZCBvYnNlcnZlZCBkaXN0cmlidXRpb24gd2l0aCB0aGUgdGhlb3JldGljYWwgY3VydmUKZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWRbQ2V0YWNlYV9vY2Nfc2FtcGxlZCRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LAogICAgICAgICAgIHk9YWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX3NhbXBsZWRbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnQpXSwKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfc2FtcGxlZCksIHk9IGRlbnNfc2FtcGxlZAogICAgKm1heChhY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfc2FtcGxlZFthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX3NhbXBsZWQpXSkgL21heChkZW5zX3NhbXBsZWQpKSArCiAgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGFjY2VwdGVkIG5hbWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBhY2NlcHRlZCBuYW1lcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMsIGFmdGVyIHNhbXBsaW5nIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKYGBgCgokXGltcGxpZXMkIEluaXRpYWwgb2JzZXJ2YXRpb25zIHJlYWxseSBkbyBub3QgZml0IHRoZSBleHBlY3RhdGlvbnMsICoqc3BlY2llcyB3aXRoIG1vcmUgdGhhbiA1IG9jY3VycmVuY2VzIG11c3QgcmVtYWluIHZlcnkgcmFyZSoqICEgQnV0IG91ciBzdWJzYW1wbGluZyBzZWVtcyB0byBjb3JyZWN0IG1vc3Qgb2YgdGhpcyBiaWFzLgoKSG93ZXZlciwgdGhpcyBtZXRob2QgcmVxdWlyZXMgdG8gbWFrZSBzZXZlcmFsIGFyYml0cmFyeSBjaG9pY2VzIHRoYXQgbWF5IGludHJvZHVjZSBuZXcgYmlhc2VzIHNvIHdlIHdpbGwgaW5zdGVhZCBzdWJzYW1wbGUgYXQgb3RoZXIgbGV2ZWxzIChwYWxhZW9udG9sb2dpY2FsIGNvbGxlY3Rpb24sIGdlb2xvZ2ljYWwgZm9ybWF0aW9uKS4gSW4gZWFjaCBjYXNlIG9ubHkgb25lIG9jY3VycmVuY2Ugd2lsbCBiZSBzYW1wbGVkIGZvciB0aGUgc2ltaWxhcmx5IGlkZW50aWZpZWQsIGEgcHJvY2VzcyB3ZSB3aWxsIHJlZmVyIHRvIGFzICoqYWdncmVnYXRpbmcqKiB0aGVzZSBvY2N1cnJlbmNlcyBhY2NvcmRpbmcgdG8gdGhlIGNob3NlbiBmYWN0b3IuCgojIyBBZ2dyZWdhdGUgc2ltaWxhcmx5IGlkZW50aWZpZWQgb2NjdXJyZW5jZXMgaW4gZWFjaCBjb2xsZWN0aW9uCgpgYGB7ciBmaWcuaGVpZ2h0PTZ9CmZvciAobiBpbiA1OjEwKXsKICBBIDwtIENldGFjZWFfb2NjW2FzLmxvZ2ljYWwodGFibGUoQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ubylbQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ub109PW4pLF0KICBBJGNvbGxlY3Rpb25fbm8gPC0gZHJvcGxldmVscyhBJGNvbGxlY3Rpb25fbm8pCgogIHAgPC0gZ2dwbG90KEEsIGFlcyh4PS1hZ2VfbWVhbiwgZmlsbD1hY2NlcHRlZF9uYW1lKSkgKwogICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGNvbD0iYmxhY2siKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgaW4gdGhlIGNvbGxlY3Rpb24iKSArCiAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbiBvZiBvY2N1cnJlbmNlcycgbWVhbiBhZ2UgZm9yIGNvbGxlY3Rpb25zIHdpdGgiLCBuLCAib2NjdXJyZW5jZXMgKGNvbG9yZWQgYnkgdGF4YSkiKSkgKwogICAgZmFjZXRfZ3JpZChjb2xsZWN0aW9uX25vIH4gLiwgc2NhbGVzPSJmcmVlIikKICBwcmludChwKQp9CgpBIDwtIENldGFjZWFfb2NjW2FzLmxvZ2ljYWwodGFibGUoQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ubylbQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ub10+MTApLF0KQSRjb2xsZWN0aW9uX25vIDwtIGRyb3BsZXZlbHMoQSRjb2xsZWN0aW9uX25vKQoKZ2dwbG90KEEsIGFlcyh4PS1hZ2VfbWVhbiwgZmlsbD1hY2NlcHRlZF9uYW1lKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBjb2w9ImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgaW4gdGhlIGNvbGxlY3Rpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBvY2N1cnJlbmNlcycgbWVhbiBhZ2UgZm9yIGNvbGxlY3Rpb25zIHdpdGggPjEwIG9jY3VycmVuY2VzIikgKwogIGZhY2V0X2dyaWQoY29sbGVjdGlvbl9ubyB+IC4sIHNjYWxlcz0iZnJlZSIpCmBgYAoKJFx0byQgRWFjaCBjb2xsZWN0aW9uIGNvcnJlc3BvbmRzIHRvIGEgdW5pcXVlIHRpbWUgaW50ZXJ2YWwgKGluZmVycmVkIGZyb20gdGhlIHVuaXF1ZSBhZ2UgbWVhbikuCgpJbiBvcmRlciB0byByZWR1Y2UgdGhlIGFidW5kYW5jZSBiaWFzLCB3ZSBtYXkga2VlcCBvbmx5IG9uZSBvY2N1cnJlbmNlIGZvciBlYWNoIGNvbGxlY3Rpb24gOgoKYGBge3J9CkNldGFjZWFfb2NjX2FnZ3JlZyA8LSBjKCkKCiMgQnJvd3NlIGFsbCBjb2xsZWN0aW9ucwpjb2xsZWN0aW9ucyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vKSkKZm9yIChjb2xsIGluIGNvbGxlY3Rpb25zKXsKICBDZXRhY2VhX29jY19jb2xsIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGNvbGxlY3Rpb25fbm89PWNvbGwsXQogIAogICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyBpbiBlYWNoIGNvbGxlY3Rpb24gJiBzYW1wbGUgb25seSAxIG9jY3VycmVuY2UKICB0YXhhIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2NvbGwkYWNjZXB0ZWRfbmFtZSkpCiAgZm9yIChuYW1lIGluIHRheGEpewogICAgQ2V0YWNlYV9vY2NfYWdncmVnIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZywgc2FtcGxlX24oQ2V0YWNlYV9vY2NfY29sbFtDZXRhY2VhX29jY19jb2xsJGFjY2VwdGVkX25hbWU9PW5hbWUsXSwgc2l6ZSA9IDEpKQogIH0KfQoKZGF0YS5mcmFtZShDZXRhY2VhX29jYyA9IGMoZGltKENldGFjZWFfb2NjKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA9IGMoZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdKSwKICAgICAgICAgICByZW1vdmVkID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWcpWzFdLAogICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJvdy5uYW1lcyA9IGMoIk51bWJlciBvZiBvY2N1cnJlbmNlcyIsICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgKHNwZWNpZXMgb25seSkiKSkKYGBgCgokXHRvJCBOb3QgZW5vdWdoIG9jY3VycmVuY2VzIGFyZSByZW1vdmVkIHRvIG1ha2UgYSBzdWZmaWNpZW50IGRpZmZlcmVuY2UuIElmIHdlIGxvb2sgYXQgdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgOgoKYGBge3J9CmNvbGxlY3Rpb25fbWF4X29jY3VycmVuY2VzIDwtIG1heCh0YWJsZShDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vKVtDZXRhY2VhX29jYyRjb2xsZWN0aW9uX25vXSkKY29sbGVjdGlvbl9tYXhfbm8gPC0gbmFtZXModGFibGUoQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ubylbQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ub11bdGFibGUoQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ubylbQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ub109PWNvbGxlY3Rpb25fbWF4X29jY3VycmVuY2VzXVsxXSkKCnRhYmxlKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkY29sbGVjdGlvbl9ubz09Y29sbGVjdGlvbl9tYXhfbm8sXSRhY2NlcHRlZF9uYW1lKSkKYGBgCgokXHRvJCBUaGVyZSBhcmUgdmVyeSBmZXcgcmVkdW5kYW5jaWVzIGFtb25nIHRoZSBhY2NlcHRlZCBuYW1lcyBpbiBjb2xsZWN0aW9ucyBzbyBhZ2dyZWdhdGluZyB0aG9zZSB3b24ndCByZWR1Y2UgdGhlIGFidW5kYW5jZSBiaWFzLgoKSW5zdGVhZCwgd2UgbWF5IHRyeSB0byAqKmFnZ3JlZ2F0ZSBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUgYXQgdGhlIGxldmVsIG9mIHRoZSBnZW9sb2dpY2FsIGZvcm1hdGlvbioqIChpZSBzdWJzYW1wbGUgb25seSBvbmUgZm9yIGVhY2gpLgoKIyMgQWdncmVnYXRlIHNpbWlsYXJseSBpZGVudGlmaWVkIG9jY3VycmVuY2VzIGluIGVhY2ggZm9ybWF0aW9uCgpgYGB7ciBmaWcuaGVpZ2h0PTh9CkNldGFjZWFfb2NjX3NwZWNpZXMgPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0KCiMgQnJvd3NlIGFsbCBudW1iZXJzIG9mIG9jY3VycmVuY2VzIGJ5IGZvcm1hdGlvbgpmb3JtYXRpb25fb2NjdXJyZW5jZXNfbmIgPC0gYXMubnVtZXJpYyhuYW1lcyh0YWJsZSh0YWJsZShkcm9wbGV2ZWxzKENldGFjZWFfb2NjX3NwZWNpZXMkZm9ybWF0aW9uKSkpKSkKCmZvciAobiBpbiBsaXN0KGMoNCwgNyksIGMoOCwgMTUpLCBjKDE2LCAxMjQpKSl7CiAgQSA8LSBDZXRhY2VhX29jY19zcGVjaWVzW2FzLmxvZ2ljYWwodGFibGUoQ2V0YWNlYV9vY2Nfc3BlY2llcyRmb3JtYXRpb24pW0NldGFjZWFfb2NjX3NwZWNpZXMkZm9ybWF0aW9uXT49blsxXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBhcy5sb2dpY2FsKHRhYmxlKENldGFjZWFfb2NjX3NwZWNpZXMkZm9ybWF0aW9uKVtDZXRhY2VhX29jY19zcGVjaWVzJGZvcm1hdGlvbl08PW5bMl0pLF0KICBBJGZvcm1hdGlvbiA8LSBkcm9wbGV2ZWxzKEEkZm9ybWF0aW9uKQoKICBwIDwtIGdncGxvdChBLCBhZXMoeD0tYWdlX21lYW4sIGZpbGw9YWNjZXB0ZWRfbmFtZSkpICsKICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBjb2w9ImJsYWNrIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGluIHRoZSBmb3JtYXRpb24iKSArCiAgICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIG5hbWUiKSArCiAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbiBvZiBvY2N1cnJlbmNlcycgbWVhbiBhZ2UgZm9yIGZvcm1hdGlvbnMgd2l0aCIsIG5bMV0sICItIiwgblsyXSwgIm9jY3VycmVuY2VzIChjb2xvcmVkIGJ5IHNwZWNpZXMpIikpICsKICAgIGZhY2V0X2dyaWQoZm9ybWF0aW9uIH4gLiwgc2NhbGVzPSJmcmVlIikKICBwcmludChwKQp9CgptYXhfc3BlY2llc19ieV9mb3JtYXRpb24gPC0gbWF4KHRhYmxlKENldGFjZWFfb2NjX3NwZWNpZXMkZm9ybWF0aW9uKSkKQSA8LSBDZXRhY2VhX29jY19zcGVjaWVzW2FzLmxvZ2ljYWwodGFibGUoQ2V0YWNlYV9vY2Nfc3BlY2llcyRmb3JtYXRpb24pW0NldGFjZWFfb2NjX3NwZWNpZXMkZm9ybWF0aW9uXT09bWF4X3NwZWNpZXNfYnlfZm9ybWF0aW9uKSxdCkEkZm9ybWF0aW9uIDwtIGRyb3BsZXZlbHMoQSRmb3JtYXRpb24pCgpnZ3Bsb3QoQSwgYWVzKHg9LWFnZV9tZWFuLCBmaWxsPXJlb3JkZXIoYWNjZXB0ZWRfbmFtZSwgLWFnZV9tZWFuKSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgY29sPSJibGFjayIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGluIHRoZSBmb3JtYXRpb24iKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCBuYW1lIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBnZ3RpdGxlKHBhc3RlKCJEaXN0cmlidXRpb24gb2Ygb2NjdXJyZW5jZXMnIG1lYW4gYWdlIGZvciIsIG1heF9zcGVjaWVzX2J5X2Zvcm1hdGlvbiwgIm9jY3VycmVuY2VzIHdpdGhvdXQgaW5kaWNhdGVkIGZvcm1hdGlvbiAoY29sb3JlZCBieSBzcGVjaWVzKSIpKSArCiAgZmFjZXRfZ3JpZChmb3JtYXRpb24gfiAuKQpgYGAKCiRcdG8kIEZvciBtb3N0IGZvcm1hdGlvbnMgZWFjaCBzcGVjaWVzIHNlZW1zIHRvIGJlIHJlc3RyaWN0ZWQgdG8gb25seSBvbmUgYWdlLCBzbyBhcyBleHBlY3RlZCB3ZSBhcmUgbm90IGxvb3NpbmcgdG9vIG11Y2ggaW5mb3JtYXRpb24gd2hlbiBhZ2dyZWdhdGluZyB0aGVtIHRvIGEgc2luZ2xlIG9jY3VycmVuY2UuCgpgYGB7cn0KQ2V0YWNlYV9vY2NfYWdncmVnIDwtIGMoKQoKIyBCcm93c2UgYWxsIGZvcm1hdGlvbnMKZm9ybWF0aW9ucyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jYyRmb3JtYXRpb24pKQpmb3IgKGZvcm0gaW4gZm9ybWF0aW9ucyl7CiAgQ2V0YWNlYV9vY2NfZm9ybSA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PWZvcm0sXQogIAogICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyBpbiBlYWNoIGZvcm1hdGlvbiAmIHNhbXBsZSBvbmx5IDEgb2NjdXJyZW5jZQogIHRheGEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZm9ybSRhY2NlcHRlZF9uYW1lKSkKICBmb3IgKG5hbWUgaW4gdGF4YSl7CiAgICBDZXRhY2VhX29jY19hZ2dyZWcgPC0gcmJpbmQoQ2V0YWNlYV9vY2NfYWdncmVnLCBzYW1wbGVfbihDZXRhY2VhX29jY19mb3JtW0NldGFjZWFfb2NjX2Zvcm0kYWNjZXB0ZWRfbmFtZT09bmFtZSxdLCBzaXplID0gMSkpCiAgfQp9CgpkYXRhLmZyYW1lKENldGFjZWFfb2NjID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnID0gYyhkaW0oQ2V0YWNlYV9vY2NfYWdncmVnKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJlbW92ZWQgPSBjKGRpbShDZXRhY2VhX29jYylbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSksCiAgICAgICAgICAgcm93Lm5hbWVzID0gYygiTnVtYmVyIG9mIG9jY3VycmVuY2VzIiwgIk51bWJlciBvZiBvY2N1cnJlbmNlcyAoc3BlY2llcyBvbmx5KSIpKQpgYGAKCiRcdG8kIEluIHRoYXQgY2FzZSB0aGUgc3ViLXNhbXBsaW5nIGlzIGJpZyBlbm91Z2ggdG8gaG9wZSBjb3JyZWN0aW5nIG91ciBiaWFzLgoKYGBge3IgZmlnLmhlaWdodD03fQojIFJlY291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUgYWZ0ZXIgdGhlIGFnZ3JlZ2F0aW9uCkNldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZSwgZnVuY3Rpb24oeCl7dGFibGUoQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWUpW3hdfSkKCm9tZWdhIDwtIDAuMQphY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMgPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWNjZXB0ZWRfbmFtZV9jb3VudApkZW5zIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpLCBmdW5jdGlvbihuKXsgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhZ2VfY29tYmluZWRfcmFuZ2UpJHZhbHVlIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllcyA8LSB0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKCiMgQ29tcGFyZSB0aGUgaW5pdGlhbCBvYnNlcnZlZCBkaXN0cmlidXRpb24gd2l0aCB0aGUgdGhlb3JldGljYWwgY3VydmUKZ2dwbG90KENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdLCAKICAgICAgIGFlcyh4PWFjY2VwdGVkX25hbWVfY291bnQsIAogICAgICAgICAgIHk9YWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KV0sIAogICAgICAgICAgIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIAogIGFubm90YXRlKCJsaW5lIiwgeCA9IDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcyksIHk9IGRlbnMKICAgICptYXgoKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpKSkpW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpXSkgL21heChkZW5zKSkrCiAgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IGFjY2VwdGVkIG5hbWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBhY2NlcHRlZCBuYW1lcyAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiKSArCiAgZmFjZXRfZ3JpZChhY2NlcHRlZF9yYW5rIH4gLiwgc2NhbGVzID0gImZyZWUiKQoKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyA8LSBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVuc19hZ2dyZWcgPC0gc2FwcGx5KDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpLCBmdW5jdGlvbihuKXsKICAgICBleHBlY3RlZF9kaXN0cmlidXRpb24obiwgb21lZ2EsIENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWdlX2NvbWJpbmVkX3JhbmdlKSR2YWx1ZQogICAgfSkKYWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZyA8LSB0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgc3BlY2llcwoKIyBDb21wYXJlIHRoZSBjb3JyZWN0ZWQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdLCAKICAgICAgIGFlcyh4PWFjY2VwdGVkX25hbWVfY291bnQsCiAgICAgICAgICAgeT1hY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnW2FzLmZhY3RvcihhY2NlcHRlZF9uYW1lX2NvdW50KV0sIAogICAgICAgICAgIGZpbGw9YWNjZXB0ZWRfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIAogIGFubm90YXRlKCJsaW5lIiwgeCA9IDE6bWF4KGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpLCB5PSBkZW5zX2FnZ3JlZwogICAgKm1heCgodGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpKVthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyldKSAvbWF4KGRlbnNfYWdncmVnKSkgKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzLCBhZnRlciBhZ2dyZWdhdGluZyBpbiBmb3JtYXRpb25zIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWcgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKYGBgCgokXHRvJCBUaGUgYmlhcyBjYW4gYmUgY29ycmlkZXJlZCBhcyBjb21wbGV0ZWx5IGNvcnJlY3RlZC4KCmBgYHtyIGZpZy5oZWlnaHQ9Nn0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiCgpwMSA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9TkEsIGNvbD0icmVkIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKcDIgPC0gZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iYmx1ZSIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgNzApICsKICB0aGVtZV92b2lkKCkKCnAzIDwtIGdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPSJncmVlbiIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgNzApICsKICB0aGVtZV92b2lkKCkKCnAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMikpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgc3ViLXNhbXBsaW5nIChibHVlKSIpCgpwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDMpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIGFnZ3JlZ2F0aW5nIGluIGZvcm1hdGlvbnMgKGdyZWVuKSIpCgpwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDMpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkgb3IgYWdncmVnYXRpbmcgaW4gZm9ybWF0aW9ucyAoZ3JlZW4pIikKYGBgCgokXHRvJCBDb21wYXJpbmcgd2l0aCB0aGUgaW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gYW5kIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiBhZnRlciBvdXIgZmlyc3Qgc3ViLXNhbXBsaW5nIGl0IGFwcGVhcnMgdGhhdCBib3RoIG1ldGhvZHMgbGVhZCB0byB2ZXJ5IHNpbWlsYXIgZGlzdHJpYnV0aW9ucy4gVGhpcyBjb25mb3J0cyB1cyBhYm91dCB0aGUgcm9idXN0bmVzcyBvZiB0aG9zZSBhcHByb2FjaGVzLgoKSG93ZXZlciwgd2UgaGF2ZSB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgb2NjdXJyZW5jZXMgdGhhdCBkbyBub3QgaGF2ZSBhbnkgaW5kaWNhdGVkIGdlb2xvZ2ljYWwgZm9ybWF0aW9uIHRvIHN1YnNhbXBsZSB0aGVtIHNlcGFyYXRlbHkuIFRvIGFwcHJveGltYXRlIGdlb2xvZ2ljYWwgZm9ybWF0aW9uIHdlIGNob3NlIHRvIHByb2NlZWQgdG8gdGhlIGFnZ3JlZ2F0aW9uIGJhc2VkIG9uIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgY291bnRyeSBhbmQgdGhlIGVhcmx5IHN0cmF0aWdyYXBoaWMgaW50ZXJ2YWwuCgojIyBBZ2dyZWdhdGUgb2NjdXJyZW5jZXMgd2l0aG91dCBmb3JtYXRpb24gYnkgY291bnRyeSArIGVhcmx5IGludGVydmFsCgpgYGB7cn0KQ2V0YWNlYV9vY2NfYWdncmVnIDwtIGMoKQoKIyBCcm93c2UgYWxsIGNvdW50cmllcwpjb3VudHJpZXMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT0iIixdJGNjKSkKZm9yIChjb3VudHJ5IGluIGNvdW50cmllcyl7CiAgQ2V0YWNlYV9vY2NfY2MgPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT0iIiAmIENldGFjZWFfb2NjJGNjPT1jb3VudHJ5LF0KICAKICAjIEJyb3dzZSBhbGwgZWFybHkgc3RyYXRpZ3JhcGhpYyBpbnRlcnZhbHMKICBlYXJseV9pbnRlcnZhbHMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfY2MkZWFybHlfaW50ZXJ2YWwpKQogIGZvciAoZWkgaW4gZWFybHlfaW50ZXJ2YWxzKXsKICAgIENldGFjZWFfb2NjX2NjX2VpIDwtIENldGFjZWFfb2NjX2NjW0NldGFjZWFfb2NjX2NjJGVhcmx5X2ludGVydmFsPT1laSxdCiAgICAKICAgICMgQnJvd3NlIGFsbCBhY2NlcHRlZCBuYW1lcyBpbiBlYWNoIGNvdW50cnkgJiBzYW1wbGUgb25seSAxIG9jY3VycmVuY2UKICAgIHRheGEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfY2NfZWkkYWNjZXB0ZWRfbmFtZSkpCiAgICBmb3IgKG5hbWUgaW4gdGF4YSl7CiAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA8LSByYmluZChDZXRhY2VhX29jY19hZ2dyZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfbihDZXRhY2VhX29jY19jY19laVtDZXRhY2VhX29jY19jY19laSRhY2NlcHRlZF9uYW1lPT1uYW1lLF0sIHNpemUgPSAxKSkKICAgIH0KICB9Cn0KCiMgQnJvd3NlIGFsbCBmb3JtYXRpb25zCmZvcm1hdGlvbnMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2MkZm9ybWF0aW9uKSkKZm9yIChmb3JtIGluIGZvcm1hdGlvbnNbLXdoaWNoKGZvcm1hdGlvbnM9PSIiKV0pewogIENldGFjZWFfb2NjX2Zvcm0gPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT1mb3JtLF0KICAKICAjIEJyb3dzZSBhbGwgYWNjZXB0ZWQgbmFtZXMgaW4gZWFjaCBmb3JtYXRpb24gJiBzYW1wbGUgb25seSAxIG9jY3VycmVuY2UKICB0YXhhIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2Zvcm0kYWNjZXB0ZWRfbmFtZSkpCiAgZm9yIChuYW1lIGluIHRheGEpewogICAgQ2V0YWNlYV9vY2NfYWdncmVnIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZywgc2FtcGxlX24oQ2V0YWNlYV9vY2NfZm9ybVtDZXRhY2VhX29jY19mb3JtJGFjY2VwdGVkX25hbWU9PW5hbWUsXSwgc2l6ZSA9IDEpKQogIH0KfQoKZGF0YS5mcmFtZShDZXRhY2VhX29jYyA9IGMoZGltKENldGFjZWFfb2NjKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA9IGMoZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdKSwKICAgICAgICAgICByZW1vdmVkID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWcpWzFdLAogICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJvdy5uYW1lcyA9IGMoIk51bWJlciBvZiBvY2N1cnJlbmNlcyIsICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgKHNwZWNpZXMgb25seSkiKSkKYGBgCgpNb3JlIG9jY3VycmVuY2VzIHJlbWFpbiBhZnRlciBhZ2dyZWdhdGluZyB3aXRoIHRoaXMgbmV3IG1ldGhvZC4gTGV0J3MgY29tcGFyZSBhZ2FpbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBkaXN0cmlidXRpb24gOgoKYGBge3IgZmlnLmhlaWdodD03fQojIFJlY291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUgYWZ0ZXIgdGhlIGFnZ3JlZ2F0aW9uCkNldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZSwgZnVuY3Rpb24oeCl7dGFibGUoQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWUpW3hdfSkKCm9tZWdhIDwtIDAuMTUKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSwgZnVuY3Rpb24obil7IGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWdlX2NvbWJpbmVkX3JhbmdlKSR2YWx1ZSB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXMgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCgojIENvbXBhcmUgdGhlIGluaXRpYWwgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LCAKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpLCB5PSBkZW5zCiAgICAqbWF4KCh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSkpKVthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKV0pIC9tYXgoZGVucykpKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWcgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKCiMgQ29tcGFyZSB0aGUgY29ycmVjdGVkIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LAogICAgICAgICAgIHk9YWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZ1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgeT0gZGVuc19hZ2dyZWcKICAgICptYXgoKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSlbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpXSkgL21heChkZW5zX2FnZ3JlZykpICsKICAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgYWNjZXB0ZWQgbmFtZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGFjY2VwdGVkIG5hbWVzIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiQ29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcywgYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZm9ybWF0aW9ucyIpICsKICBmYWNldF9ncmlkKGFjY2VwdGVkX3JhbmsgfiAuLCBzY2FsZXMgPSAiZnJlZSIpCgphY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnIDwtIENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWNjZXB0ZWRfbmFtZV9jb3VudApkZW5zX2FnZ3JlZyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZyksIGZ1bmN0aW9uKG4pewogICAgIGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhZ2VfY29tYmluZWRfcmFuZ2UpJHZhbHVlCiAgICB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnIDwtIHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCmBgYAoKJFx0byQgVGhlIGNvcnJlc3BvbmRhbmNlIGlzIHN0aWxsIGdvb2QsIGV4Y2VwdCBmb3IgdHdvIHRheGEgOgoKYGBge3J9CnRhYmxlKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXVthY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnPjEwLF0kYWNjZXB0ZWRfbmFtZSkpCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CkNldGFjZWFfb2NjX2FnZ3JlZyRhZ2VfcmFuZ2UgPC0gQ2V0YWNlYV9vY2NfYWdncmVnJG1heF9tYS1DZXRhY2VhX29jY19hZ2dyZWckbWluX21hCkNldGFjZWFfb2NjX2FnZ3JlZyRtaW5fbWluX21hIDwtIGFwcGx5KENldGFjZWFfb2NjX2FnZ3JlZywgMSwgZnVuY3Rpb24oWCl7bWluKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWdlX3JhbmdlPDEwICYgQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWU9PVhbImFjY2VwdGVkX25hbWUiXSxdJG1pbl9tYSl9KQpDZXRhY2VhX29jY19hZ2dyZWckbWF4X21heF9tYSA8LSBhcHBseShDZXRhY2VhX29jY19hZ2dyZWcsIDEsIGZ1bmN0aW9uKFgpe21heChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFnZV9yYW5nZTwxMCAmIENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lPT1YWyJhY2NlcHRlZF9uYW1lIl0sXSRtYXhfbWEpfSkKQ2V0YWNlYV9vY2NfYWdncmVnJGFnZV9jb21iaW5lZF9tZWFuIDwtIChDZXRhY2VhX29jY19hZ2dyZWckbWluX21pbl9tYSArIENldGFjZWFfb2NjX2FnZ3JlZyRtYXhfbWF4X21hKS8yCkNldGFjZWFfb2NjX2FnZ3JlZyRhZ2VfY29tYmluZWRfcmFuZ2UgPC0gQ2V0YWNlYV9vY2NfYWdncmVnJG1heF9tYXhfbWEtQ2V0YWNlYV9vY2NfYWdncmVnJG1pbl9taW5fbWEKQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWVfY291bnQgPC0gc2FwcGx5KENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lLCBmdW5jdGlvbih4KXt0YWJsZShDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZSlbeF19KQpDZXRhY2VhX29jY19hZ2dyZWckb2NjdXJyZW5jZV9jb21iaW5lZF9kZW5zaXR5IDwtIENldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lX2NvdW50L0NldGFjZWFfb2NjX2FnZ3JlZyRhZ2VfY29tYmluZWRfcmFuZ2UKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTUsIG1lc3NhZ2U9RkFMU0V9CmJyZWFrcyA8LSBjKDAuMTI1LDAuMjUsMC41LDEsMiw0LDgsMTYpCgpwX2JlZm9yZSA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIHhlbmQgPSAtbWluX21pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIGNvbG9yPW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MC41LCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMiKSArCiAgbGFicyhjb2xvdXI9Ik9jY3VycmVuY2VcbmRlbnNpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gTkEpLAogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9YnJlYWtzLCBsYWJlbHM9YnJlYWtzKSArIAogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2Ygc3BlY2llcyBmb3NzaWwgYWdlIHJhbmdlcywgYmVmb3JlIGNvcnJlY3Rpbmcgc2FtcGxpbmcgKG4gPSAiLCBkaW0oQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIiAmIENldGFjZWFfb2NjJGFnZV9yYW5nZTwxMCxdKVsxXSwgIikiLCBzZXA9IiIpKQpwX2JlZm9yZQoKZ2dzYXZlKCIuLi9JbWFnZXMvUmFuZ2VfZGlzdHJpYnV0aW9uc19iZWZvcmVfYWdncmVnYXRpbmcuc3ZnIiwgcGxvdCA9IHBfYmVmb3JlLCBkZXZpY2UgPSAic3ZnIiwgYmcgPSAidHJhbnNwYXJlbnQiKQoKcF9hZnRlciA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiICYgQ2V0YWNlYV9vY2NfYWdncmVnJGFnZV9yYW5nZTwxMCxdLCBhZXMoeD0tbWF4X21hLCB5PWFjY2VwdGVkX25hbWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLW1heF9tYXhfbWEsIHkgPSByZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIHhlbmQgPSAtbWluX21pbl9tYSwgeWVuZD1yZW9yZGVyKGFjY2VwdGVkX25hbWUsIC1hZ2VfY29tYmluZWRfbWVhbiksIGNvbG9yPW9jY3VycmVuY2VfY29tYmluZWRfZGVuc2l0eSksIGFycm93PWFycm93KGVuZHMgPSAiYm90aCIsIGFuZ2xlPTkwLCBsZW5ndGggPSB1bml0KDEsICJtbSIpKSwgYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeD0tYWdlX3J1bmlmKSwgY29sPSJyZWQiLCBjZXg9MC41LCBhbHBoYT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMiKSArCiAgbGFicyhjb2xvdXI9Ik9jY3VycmVuY2VcbmRlbnNpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gTkEpLAogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3IgPSBOQSkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3VycyA9IGMoImRhcmtibHVlIiwgImZvcmVzdGdyZWVuIiwgImJsYWNrIiksIHRyYW5zPSJsb2ciLCBicmVha3M9YnJlYWtzLCBsYWJlbHM9YnJlYWtzKSArIAogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbnMgb2Ygc3BlY2llcyBmb3NzaWwgYWdlIHJhbmdlcywgYWZ0ZXIgY29ycmVjdGluZyBzYW1wbGluZyAobiA9ICIsIGRpbShDZXRhY2VhX29jY19zYW1wbGVkKVsxXSwgIikiLCBzZXA9IiIpKQpwX2FmdGVyCgpnZ3NhdmUoIi4uL0ltYWdlcy9SYW5nZV9kaXN0cmlidXRpb25zX2FmdGVyX2FnZ3JlZ2F0aW5nLnN2ZyIsIHBsb3QgPSBwX2FmdGVyLCBkZXZpY2UgPSAic3ZnIiwgYmcgPSAidHJhbnNwYXJlbnQiKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgbWVzc2FnZT1GQUxTRX0KY29uZGl0aW9ucyA8LSBDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiCgpwMSA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9TkEsIGNvbD0icmVkIikgKwogIHhsaW0oLW1heChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0kYWdlX3J1bmlmKS0xLCAxKSArCiAgeWxpbSgwLCA3MCkgKwogIHRoZW1lX3ZvaWQoKQoKcDIgPC0gZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iYmx1ZSIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgNzApICsKICB0aGVtZV92b2lkKCkKCnAzIDwtIGdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPSJncmVlbiIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgNzApICsKICB0aGVtZV92b2lkKCkKCnAxICsgYW5ub3RhdGlvbl9jdXN0b20oZ2dwbG90R3JvYihwMikpICsgZ2d0aXRsZSgiSW5pdGlhbCBvY2N1cnJlbmNlcyBkaXN0cmlidXRpb24gKHJlZCkgYW5kIGNvbXBhcmlzb24gYWZ0ZXIgc3ViLXNhbXBsaW5nIChibHVlKSIpCgpwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDMpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIGFnZ3JlZ2F0aW5nIGluIGZvcm1hdGlvbnMgKGdyZWVuKSIpCgpwX2FsbCA8LSBwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDMpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkgb3IgYWdncmVnYXRpbmcgaW4gZm9ybWF0aW9ucyAoZ3JlZW4pIikgKyB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG9yID0gTkEpKQpwX2FsbAoKZ2dzYXZlKCIuLi9JbWFnZXMvT2NjdXJyZW5jZV9kaXN0cmlidXRpb25zX2NvbXBhcmlzb24uc3ZnIiwgcGxvdCA9IHBfYWxsLCBkZXZpY2UgPSAic3ZnIiwgYmcgPSAidHJhbnNwYXJlbnQiKQpgYGAKCiRcdG8kIENvbXBhcmluZyB3aXRoIHRoZSBpbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiBhbmQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIGFmdGVyIG91ciBmaXJzdCBzdWItc2FtcGxpbmcgaXQgYXBwZWFycyB0aGF0IGJvdGggbWV0aG9kcyBsZWFkIHRvIHZlcnkgc2ltaWxhciBkaXN0cmlidXRpb25zLiBUaGlzIGNvbmZvcnRzIHVzIGFib3V0IHRoZSByb2J1c3RuZXNzIG9mIHRob3NlIGFwcHJvYWNoZXMuCgpSZXBsYWNpbmcgY291dHJpZXMgYnkgZ2Vsb2dpY2FsIHBsYXRlcyBzZWVtcyB0byBtYWtlIG1vcmUgc2VucyBmcm9tIGEgcGFsYWVvbnRvbG9naWNhbCBwZXJzcGVjdGl2ZSwgc28gbGV0J3MgdHJ5IGl0LgoKIyMgQWdncmVnYXRlIG9jY3VycmVuY2VzIHdpdGhvdXQgZm9ybWF0aW9uIGJ5IGdlb3BsYXRlICsgZWFybHkgaW50ZXJ2YWwKCmBgYHtyfQpDZXRhY2VhX29jY19hZ2dyZWcgPC0gYygpCgojIEJyb3dzZSBhbGwgZ2VvcGxhdGVzCmdlb3BsYXRlcyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PSIiLF0kZ2VvcGxhdGUpKQpmb3IgKGdwIGluIGdlb3BsYXRlcyl7CiAgQ2V0YWNlYV9vY2NfZ3AgPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT0iIiAmIENldGFjZWFfb2NjJGdlb3BsYXRlPT1ncCxdCiAgCiAgIyBCcm93c2UgYWxsIGVhcmx5IHN0cmF0aWdyYXBoaWMgaW50ZXJ2YWxzCiAgZWFybHlfaW50ZXJ2YWxzIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2dwJGVhcmx5X2ludGVydmFsKSkKICBmb3IgKGVpIGluIGVhcmx5X2ludGVydmFscyl7CiAgICBDZXRhY2VhX29jY19ncF9laSA8LSBDZXRhY2VhX29jY19ncFtDZXRhY2VhX29jY19ncCRlYXJseV9pbnRlcnZhbD09ZWksXQogICAgCiAgICAjIEJyb3dzZSBhbGwgYWNjZXB0ZWQgbmFtZXMgJiBzYW1wbGUgb25seSAxIG9jY3VycmVuY2UKICAgIHRheGEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZ3BfZWkkYWNjZXB0ZWRfbmFtZSkpCiAgICBmb3IgKG5hbWUgaW4gdGF4YSl7CiAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA8LSByYmluZChDZXRhY2VhX29jY19hZ2dyZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfbihDZXRhY2VhX29jY19ncF9laVtDZXRhY2VhX29jY19ncF9laSRhY2NlcHRlZF9uYW1lPT1uYW1lLF0sIHNpemUgPSAxKSkKICAgIH0KICB9Cn0KCiMgQnJvd3NlIGFsbCBmb3JtYXRpb25zCmZvcm1hdGlvbnMgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2MkZm9ybWF0aW9uKSkKZm9yIChmb3JtIGluIGZvcm1hdGlvbnNbLXdoaWNoKGZvcm1hdGlvbnM9PSIiKV0pewogIENldGFjZWFfb2NjX2Zvcm0gPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT1mb3JtLF0KICAKICAjIEJyb3dzZSBhbGwgYWNjZXB0ZWQgbmFtZXMgaW4gZWFjaCBmb3JtYXRpb24gJiBzYW1wbGUgb25seSAxIG9jY3VycmVuY2UKICB0YXhhIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2Zvcm0kYWNjZXB0ZWRfbmFtZSkpCiAgZm9yIChuYW1lIGluIHRheGEpewogICAgQ2V0YWNlYV9vY2NfYWdncmVnIDwtIHJiaW5kKENldGFjZWFfb2NjX2FnZ3JlZywgc2FtcGxlX24oQ2V0YWNlYV9vY2NfZm9ybVtDZXRhY2VhX29jY19mb3JtJGFjY2VwdGVkX25hbWU9PW5hbWUsXSwgc2l6ZSA9IDEpKQogIH0KfQoKZGF0YS5mcmFtZShDZXRhY2VhX29jYyA9IGMoZGltKENldGFjZWFfb2NjKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIENldGFjZWFfb2NjX2FnZ3JlZyA9IGMoZGltKENldGFjZWFfb2NjX2FnZ3JlZylbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0oQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdKSwKICAgICAgICAgICByZW1vdmVkID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWcpWzFdLAogICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0pWzFdLWRpbShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSlbMV0pLAogICAgICAgICAgIHJvdy5uYW1lcyA9IGMoIk51bWJlciBvZiBvY2N1cnJlbmNlcyIsICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgKHNwZWNpZXMgb25seSkiKSkKYGBgCgpNb3JlIG9jY3VycmVuY2VzIHJlbWFpbiBhZnRlciBhZ2dyZWdhdGluZyB3aXRoIHRoaXMgbmV3IG1ldGhvZC4gTGV0J3MgY29tcGFyZSBhZ2FpbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBkaXN0cmlidXRpb24gOgoKYGBge3IgZmlnLmhlaWdodD03fQojIFJlY291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFjY2VwdGVkIG5hbWUgYWZ0ZXIgdGhlIGFnZ3JlZ2F0aW9uCkNldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9uYW1lX2NvdW50IDwtIHNhcHBseShDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfbmFtZSwgZnVuY3Rpb24oeCl7dGFibGUoQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX25hbWUpW3hdfSkKCm9tZWdhIDwtIDAuMTUKYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFjY2VwdGVkX25hbWVfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSwgZnVuY3Rpb24obil7IGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuaz09InNwZWNpZXMiLF0kYWdlX2NvbWJpbmVkX3JhbmdlKSR2YWx1ZSB9KQphY2NlcHRlZF9uYW1lX2NvdW50X2NhdGVnb3JpZXMgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llcykpKSAgIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBzcGVjaWVzCgojIENvbXBhcmUgdGhlIGluaXRpYWwgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LCAKICAgICAgICAgICB5PWFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpLCB5PSBkZW5zCiAgICAqbWF4KCh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXMpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKSkpKVthcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzKV0pIC9tYXgoZGVucykpKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBhY2NlcHRlZCBuYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIG5hbWUgPSAiTnVtYmVyIG9mIGNvcnJlc3BvbmRpbmcgYWNjZXB0ZWQgbmFtZXMgKGxvZy1zY2FsZSkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJPYnNlcnZlZCBkaXN0cmlidXRpb24iKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKCJDb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgYW5kIG9ic2VydmVkIGRpc3RyaWJ1dGlvbnMgb2YgbnVtYmVyIG9mIG9jY3VycmVuY2VzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWcgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKCiMgQ29tcGFyZSB0aGUgY29ycmVjdGVkIG9ic2VydmVkIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBjdXJ2ZQpnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSwgCiAgICAgICBhZXMoeD1hY2NlcHRlZF9uYW1lX2NvdW50LAogICAgICAgICAgIHk9YWNjZXB0ZWRfbmFtZV9jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZ1thcy5mYWN0b3IoYWNjZXB0ZWRfbmFtZV9jb3VudCldLCAKICAgICAgICAgICBmaWxsPWFjY2VwdGVkX3JhbmspKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgeT0gZGVuc19hZ2dyZWcKICAgICptYXgoKHRhYmxlKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykpKSlbYXMuZmFjdG9yKGFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcpXSkgL21heChkZW5zX2FnZ3JlZykpICsKICAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMgYnkgYWNjZXB0ZWQgbmFtZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGFjY2VwdGVkIG5hbWVzIChsb2ctc2NhbGUpIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iT2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2d0aXRsZSgiQ29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBvYnNlcnZlZCBkaXN0cmlidXRpb25zIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcywgYWZ0ZXIgYWdncmVnYXRpbmcgaW4gZ2VvcGxhdGVzIikgKwogIGZhY2V0X2dyaWQoYWNjZXB0ZWRfcmFuayB+IC4sIHNjYWxlcyA9ICJmcmVlIikKCmFjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSRhY2NlcHRlZF9uYW1lX2NvdW50CmRlbnNfYWdncmVnIDwtIHNhcHBseSgxOm1heChhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmFjY2VwdGVkX25hbWVfY291bnRfY2F0ZWdvcmllc19hZ2dyZWcgPC0gdGFibGUoYWNjZXB0ZWRfbmFtZV9jb3VudF9zcGVjaWVzX2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShhY2NlcHRlZF9uYW1lX2NvdW50X3NwZWNpZXNfYWdncmVnKSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHNwZWNpZXMKYGBgCgokXHRvJCBUaGUgY29ycmVzcG9uZGFuY2UgaXMgc3RpbGwgZ29vZCwgZXhjZXB0IGZvciB0d28gdGF4YSA6CgpgYGB7cn0KdGFibGUoZHJvcGxldmVscyhDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdW2FjY2VwdGVkX25hbWVfY291bnRfc3BlY2llc19hZ2dyZWc+MTAsXSRhY2NlcHRlZF9uYW1lKSkKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTZ9CmNvbmRpdGlvbnMgPC0gQ2V0YWNlYV9vY2MkYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIgoKcDEgPC0gZ2dwbG90KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPU5BLCBjb2w9InJlZCIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgNzApICsKICB0aGVtZV92b2lkKCkKCnAyIDwtIGdncGxvdChDZXRhY2VhX29jY19zYW1wbGVkLCBhZXMoeD0tYWdlX3J1bmlmKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC41LCBhbHBoYT0wLjUsIGZpbGw9ImJsdWUiKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDcwKSArCiAgdGhlbWVfdm9pZCgpCgpwMyA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09InNwZWNpZXMiLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iZ3JlZW4iKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDcwKSArCiAgdGhlbWVfdm9pZCgpCgpwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkiKQoKcDEgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAzKSkgKyBnZ3RpdGxlKCJJbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiAocmVkKSBhbmQgY29tcGFyaXNvbiBhZnRlciBhZ2dyZWdhdGluZyBpbiBnZW9wbGF0ZXMgKGdyZWVuKSIpCgpwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDMpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkgb3IgYWdncmVnYXRpbmcgaW4gZ2VvcGxhdGVzIChncmVlbikiKQpgYGAKCiRcdG8kIERlbGltaXRpbmcgYnkgZ2VvbG9naWNhbCBwbGF0ZXMgKCsgYWdlKSBpbnN0ZWFkIG9mIGNvdW50cmllcyAoKyBhZ2UpIGxlYWRzIHRvIHNpbWlsYXIgZGlzdHJpYnV0aW9ucywgc28gd2Ugd2lsbCBrZWVwIGl0LgoKIyMgQ2hlY2sgdGhhdCB0aGUgc2FtcGxpbmcgbWV0aG9kcyBkbyBub3QgaW50cm9kdWNlIGJpYXNlcyBpbiB0aGUgcmVwYXJ0aXRpb24gYmV0d2VlbiBPZG9udG9jZXRpIGFuZCBNeXN0aWNldGkKCk15c3RlY2V0ZXMgYXJlIHVzdWFsbHkgbGFyZ2VyIHRoYW4gb2RvbnRvY2V0ZXMsIGFuZCBzaXplIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHdpZGVyIGdlb2dyYXBoaWMgcmFuZ2Ugc28gc2luY2Ugd2UgYXJlIHN1YnNhbXBsaW5nIG9jY3VycmVuY2VzIGFjY29yZGluZyB0byBnZW9sb2dpY2FsIGZvcm1hdGlvbiB3ZSBtYXkgYmUgYmlhc2luZyBvdXIgZGF0YSB0b3dhcmRzIG1vcmUgd2lkZXNwcmVhZCBzcGVjaWVzLCB0aGVyZWZvcmUgdG93YXJkcyBteXN0ZWNldGVzLgoKTG9vayBhdCB0aGUgZmFtaWxpZXMgZmlyc3QgOgoKYGBge3IgZmlnLmhlaWdodD02fQpmYW1pbGllcyA8LSByYmluZChDZXRhY2VhX29jYyA9IENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3Jhbms9PSJzcGVjaWVzIixdLAogICAgICAgICAgICAgICAgICBDZXRhY2VhX29jY19zYW1wbGVkID0gQ2V0YWNlYV9vY2Nfc2FtcGxlZCwKICAgICAgICAgICAgICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnID0gQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rPT0ic3BlY2llcyIsXSkgJT4lCiAgICAgICAgICAgIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJEYXRhc2V0IikKCmZhbWlsaWVzIDwtIGZhbWlsaWVzWyxjKCJEYXRhc2V0IiwgImZhbWlseSIpXQpmYW1pbGllcyREYXRhc2V0IDwtIHNhcHBseShmYW1pbGllcyREYXRhc2V0LCBnc3ViLCBwYXR0ZXJuPSJcXC4uKiIsIHJlcGxhY2VtZW50PSIiKQoKZ2dwbG90KGZhbWlsaWVzW2ZhbWlsaWVzJGZhbWlseSAhPSAiTk9fRkFNSUxZX1NQRUNJRklFRCIsXSwgYWVzKHggPSBEYXRhc2V0LCBmaWxsID0gZmFtaWx5KSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgY29sPSJibGFjayIpCmBgYAoKJFx0byQgVGhlIGZhbWlseSByZXBhcnRpdGlvbnMgdmFyeSBhIGJpdCBhZnRlciBzdWJzYW1wbGluZywgYnV0IGJlY2F1c2Ugb2YgdGhlIGxpbWl0ZWQgbnVtYmVyIG9mIHNwZWNpZXMgYnkgZmFtaWx5IHRoZSBmYWN0IHRoYXQgd2UgY29ycmVjdGVkIHRoZSBvdmVyc2FtcGxpbmcgb2Ygc29tZSBzcGVjaWVzIGNvdWxkIGhhdmUgYSBkaXNwcm9wb3J0aW9uYXRlIGVmZmVjdC4KCkxldCdzIGxvb2sgcmF0aGVyIGF0IGEgaGlnaGVyIHRheG9ub21pYyByYW5rLCBieSBpbXBvcnRpbmcgdGhlIHRvcG9sb2d5IG9mIGNldGFjZWFuIGZhbWlsaWVzIChmcm9tIE1hcnggZXQgYWwuIDIwMTYpIDoKCmBgYHtyIGZpZy53aWR0aD0xMH0KZmFtaWxpZXNfdHJlZSA8LSBhcGU6OnJlYWQudHJlZSgiLi4vYmpvZWxsZS1zdHJhdGlncmFwaGljX2FnZV91bmNlcnRhaW50eV9TSS05YmJjZWYyL2NldGFjZWFuc19kYXRhL2Zvc3NpbHMvZmFtaWxpZXMudHJlIikKZ2d0cmVlKGZhbWlsaWVzX3RyZWUpICsKICBnZW9tX3RpcGxhYigpICsKICBnZW9tX25vZGVsYWIoKSArIAogIGdndGl0bGUoIlRvcG9sb2d5IG9mIGNldGFjZWFuIGZhbWlsaWVzIikgKwogIHhsaW0oMCwgOCkKCmZhbWlsaWVzX3RyZWVfT2RvbnRvY2V0aSA8LSBjYXN0b3I6OmdldF9zdWJ0cmVlX2F0X25vZGUoZmFtaWxpZXNfdHJlZSwgIk9kb250b2NldGkiKSRzdWJ0cmVlCmdndHJlZShmYW1pbGllc190cmVlX09kb250b2NldGkpICsKICBnZW9tX3RpcGxhYigpICsKICBnZW9tX25vZGVsYWIoKSArIAogIGdndGl0bGUoIlRvcG9sb2d5IG9mIG9kb250b2NldGUgZmFtaWxpZXMiKSArCiAgeGxpbSgwLCA1KQoKZmFtaWxpZXNfdHJlZV9NeXN0aWNldGkgPC0gY2FzdG9yOjpnZXRfc3VidHJlZV9hdF9ub2RlKGZhbWlsaWVzX3RyZWUsICJNeXN0aWNldGkiKSRzdWJ0cmVlCmdndHJlZShmYW1pbGllc190cmVlX015c3RpY2V0aSkgKwogIGdlb21fdGlwbGFiKCkgKwogIGdlb21fbm9kZWxhYigpICsgCiAgZ2d0aXRsZSgiVG9wb2xvZ3kgb2YgbXlzdGljZXRlIGZhbWlsaWVzIikgKwogIHhsaW0oMCwgNSkKCmZhbWlsaWVzX3RyZWVfU3RlbSA8LSBjYXN0b3I6OmdldF9zdWJ0cmVlX3dpdGhfdGlwcyhmYW1pbGllc190cmVlLCBvbWl0X3RpcHMgPSBjKGZhbWlsaWVzX3RyZWVfT2RvbnRvY2V0aSR0aXAubGFiZWwsIGZhbWlsaWVzX3RyZWVfTXlzdGljZXRpJHRpcC5sYWJlbCkpJHN1YnRyZWUKZ2d0cmVlKGZhbWlsaWVzX3RyZWVfU3RlbSkgKwogIGdlb21fdGlwbGFiKCkgKwogIGdlb21fbm9kZWxhYigpICsgCiAgZ2d0aXRsZSgiVG9wb2xvZ3kgb2YgYXJjaGVvY2V0ZSBmYW1pbGllcyIpICsKICB4bGltKDAsIDMpCmBgYAoKYGBge3J9Ck9kb250b2NldGlfZmFtaWxpZXMgPC0gYyhmYW1pbGllc190cmVlX09kb250b2NldGlbYygidGlwLmxhYmVsIiwgIm5vZGUubGFiZWwiKV0sICJLZW50cmlvZG9udGlkYWUiLCAiU3F1YWxvemlwaGlpZGFlIikKTXlzdGljZXRpX2ZhbWlsaWVzIDwtIGZhbWlsaWVzX3RyZWVfTXlzdGljZXRpW2MoInRpcC5sYWJlbCIsICJub2RlLmxhYmVsIildCmFyY2hhZW9jZXRlX2ZhbWlsaWVzIDwtIGZhbWlsaWVzX3RyZWVfU3RlbVtjKCJ0aXAubGFiZWwiLCAibm9kZS5sYWJlbCIpXQoKZmFtaWx5X3RvX3RheG9ub21pY19ncm91cCA8LSBmdW5jdGlvbihmYW1pbHkpewogIHJldHVybihjKCJPZG9udG9jZXRpIiwgIk15c3RpY2V0aSIsICJhcmNoYWVvY2V0ZXMiKVsKICAgIGdyZXAocGF0dGVybiA9IGZhbWlseSwKICAgICAgICAgeCA9IGxpc3QoT2RvbnRvY2V0aV9mYW1pbGllcywgTXlzdGljZXRpX2ZhbWlsaWVzLCBhcmNoYWVvY2V0ZV9mYW1pbGllcykpXSkKICB9CgpmYW1pbGllcyRUYXhvbm9taWMuZ3JvdXAgPC0gYXMuY2hhcmFjdGVyKHNhcHBseShmYW1pbGllcyRmYW1pbHksIGZhbWlseV90b190YXhvbm9taWNfZ3JvdXApKQpnZ3Bsb3QoZmFtaWxpZXNbZmFtaWxpZXMkZmFtaWx5ICE9ICJOT19GQU1JTFlfU1BFQ0lGSUVEIixdLCBhZXMoeCA9IERhdGFzZXQsIGZpbGwgPSBUYXhvbm9taWMuZ3JvdXApKSArIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiLCBjb2w9ImJsYWNrIikKCmdncGxvdChmYW1pbGllc1tmYW1pbGllcyRmYW1pbHkgIT0gIk5PX0ZBTUlMWV9TUEVDSUZJRUQiICYgZmFtaWxpZXMkVGF4b25vbWljLmdyb3VwICE9ICJhcmNoYWVvY2V0ZXMiLF0sIGFlcyh4ID0gRGF0YXNldCwgZmlsbCA9IFRheG9ub21pYy5ncm91cCkpICsKICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIGNvbD0iYmxhY2siKQpgYGAKCiRcdG8kIFRoZXJlIGlzIGEgc21hbGxlciBwcm9wb3J0aW9uIG9mIGFyY2hlb2NldGUgb2NjdXJyZW5jZXMgYWZ0ZXIgZWl0aGVyIHNhbXBsaW5nLCBiZWNhdXNlIGEgaHVnZSBjbHVzdGVyIGlzIHN1YnNhbXBsZWQgYXJvdW5kIDM1IE15IGFnbywgYnV0IHRoaXMgZWZmZWN0IGlzIGV4cGVjdGVkLiBIb3dldmVyLCBmb3IgdGhlIE15c3RpY2V0aSB2cy4gT2RvdG9jZXRpIHRoZXJlIGlzIG5vIGh1Z2UgYXBwYXJlbnQgYmlhcywgZXNwZWNpYWxseSB3aXRoIHRoZSBhZ2dyZWdhdGluZyBtZXRob2QuCgpgYGB7cn0KIyB3cml0ZShDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0ic3BlY2llcyIsXSRhZ2VfcnVuaWYsIAojICAgICAgIGZpbGUgPSAiLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9hZ2VfcnVuaWZfYWdlX3NwZWNpZXNfY29ycmVjdGVkLmNzdiIsIAojICAgICAgIHNlcCA9ICI7ICIsIAojICAgICAgIG5jb2x1bW5zID0gZGltKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayA9PSJzcGVjaWVzIixdKVsxXSkKd3JpdGUudGFibGUoQ2V0YWNlYV9vY2NfYWdncmVnW0NldGFjZWFfb2NjX2FnZ3JlZyRhY2NlcHRlZF9yYW5rID09ICJzcGVjaWVzIiwgYygibWluX21hIiwgIm1heF9tYSIpXSwKICAgICAgICAgICAgZmlsZT0iLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9vY2N1cnJlbmNlc19taW5fbWF4X2FnZV9zcGVjaWVzX2NvcnJlY3RlZC5jc3YiLCBzZXA9IiwiLCByb3cubmFtZXM9RkFMU0UsIGNvbC5uYW1lcz1GQUxTRSkKCndyaXRlLnRhYmxlKENldGFjZWFfb2NjX2FnZ3JlZ1tDZXRhY2VhX29jY19hZ2dyZWckYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSwgYygibWluX21hIiwgIm1heF9tYSIpXSwKICAgICAgICAgICAgZmlsZT0iLi4vZGF0YS1jZXRhY2VhbnMvQ2V0YWNlYV9vY2N1cnJlbmNlc19taW5fbWF4X2FnZV9zcGVjaWVzX2dlbmVyYV9jb3JyZWN0ZWQuY3N2Iiwgc2VwPSIsIiwgcm93Lm5hbWVzPUZBTFNFLCBjb2wubmFtZXM9RkFMU0UpCmBgYAoKYGBge3J9CmdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdbQ2V0YWNlYV9vY2NfYWdncmVnJGFjY2VwdGVkX3JhbmsgPT0gInNwZWNpZXMiLF0sIGFlcyh4PS1hZ2VfcnVuaWYsIHk9cm5vcm0obGVuZ3RoKGFnZV9ydW5pZiksIDEsIDAuMDMpKSkgKwogIGdlb21fcG9pbnQoY2V4PTEuNSwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk9jY3VycmVuY2VzIiwgbGltaXRzID0gYygwLjUsIDEuNSkpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUocGFzdGUoIlJlcGFydGl0aW9uIG9mIiwgZGltKGNldGFjZWFfcGJkYilbMV0sICJyZWNvcmRlZCBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUiKSkKYGBgCgojIEZhc3RlciBnZW51cy1sZXZlbCBhbmFseXNpcwoKYGBge3J9CkNldGFjZWFfb2NjX2FnZ3JlZ19nZW4gPC0gYygpCgojIEJyb3dzZSBhbGwgZm9ybWF0aW9ucwpmb3JtYXRpb25zIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjJGZvcm1hdGlvbikpCmZvciAoZm9ybSBpbiBmb3JtYXRpb25zWy13aGljaChmb3JtYXRpb25zPT0iIildKXsKICBDZXRhY2VhX29jY19mb3JtIDwtIENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGZvcm1hdGlvbj09Zm9ybSxdCiAgCiAgIyBCcm93c2UgYWxsIGdlbmVyYSBpbiBlYWNoIGZvcm1hdGlvbiAmIHNhbXBsZSBvbmx5IDEgb2NjdXJyZW5jZQogIGdlbmVyYSA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jY19mb3JtJGdlbnVzKSkKICBmb3IgKGdlbiBpbiBnZW5lcmEpewogICAgQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiA8LSByYmluZChDZXRhY2VhX29jY19hZ2dyZWdfZ2VuLCBzYW1wbGVfbihDZXRhY2VhX29jY19mb3JtW0NldGFjZWFfb2NjX2Zvcm0kZ2VudXM9PWdlbixdLCBzaXplID0gMSkpCiAgfQp9CgojIEJyb3dzZSBhbGwgZ2VvcGxhdGVzCmdlb3BsYXRlcyA8LSBsZXZlbHMoZHJvcGxldmVscyhDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRmb3JtYXRpb249PSIiLF0kZ2VvcGxhdGUpKQpmb3IgKGdwIGluIGdlb3BsYXRlcyl7CiAgQ2V0YWNlYV9vY2NfZ3AgPC0gQ2V0YWNlYV9vY2NbQ2V0YWNlYV9vY2MkZm9ybWF0aW9uPT0iIiAmIENldGFjZWFfb2NjJGdlb3BsYXRlPT1ncCxdCiAgCiAgIyBCcm93c2UgYWxsIGVhcmx5IHN0cmF0aWdyYXBoaWMgaW50ZXJ2YWxzCiAgZWFybHlfaW50ZXJ2YWxzIDwtIGxldmVscyhkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2dwJGVhcmx5X2ludGVydmFsKSkKICBmb3IgKGVpIGluIGVhcmx5X2ludGVydmFscyl7CiAgICBDZXRhY2VhX29jY19ncF9laSA8LSBDZXRhY2VhX29jY19ncFtDZXRhY2VhX29jY19ncCRlYXJseV9pbnRlcnZhbD09ZWksXQogICAgCiAgICAjIEJyb3dzZSBhbGwgZ2VuZXJhICYgc2FtcGxlIG9ubHkgMSBvY2N1cnJlbmNlCiAgICBnZW5lcmEgPC0gbGV2ZWxzKGRyb3BsZXZlbHMoQ2V0YWNlYV9vY2NfZ3BfZWkkZ2VudXMpKQogICAgZm9yIChnZW4gaW4gZ2VuZXJhKXsKICAgICAgQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiA8LSByYmluZChDZXRhY2VhX29jY19hZ2dyZWdfZ2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX24oQ2V0YWNlYV9vY2NfZ3BfZWlbQ2V0YWNlYV9vY2NfZ3BfZWkkZ2VudXM9PWdlbixdLCBzaXplID0gMSkpCiAgICB9CiAgfQp9CgpkYXRhLmZyYW1lKENldGFjZWFfb2NjID0gYyhkaW0oQ2V0YWNlYV9vY2MpWzFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSlbMV0pLAogICAgICAgICAgIENldGFjZWFfb2NjX2FnZ3JlZ19nZW4gPSBjKGRpbShDZXRhY2VhX29jY19hZ2dyZWdfZ2VuKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbShDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdKVsxXSksCiAgICAgICAgICAgcmVtb3ZlZCA9IGMoZGltKENldGFjZWFfb2NjKVsxXS1kaW0oQ2V0YWNlYV9vY2NfYWdncmVnX2dlbilbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgZGltKENldGFjZWFfb2NjW0NldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSlbMV0tZGltKENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0pWzFdKSwKICAgICAgICAgICByb3cubmFtZXMgPSBjKCJOdW1iZXIgb2Ygb2NjdXJyZW5jZXMiLCAiTnVtYmVyIG9mIG9jY3VycmVuY2VzIChzcGVjaWVzIGFuZCBnZW5lcmEgb25seSkiKSkKYGBgCgpNb3JlIG9jY3VycmVuY2VzIHJlbWFpbiBhZnRlciBhZ2dyZWdhdGluZyB3aXRoIHRoaXMgbmV3IG1ldGhvZC4gTGV0J3MgY29tcGFyZSBhZ2FpbiB3aXRoIHRoZSB0aGVvcmV0aWNhbCBkaXN0cmlidXRpb24gOgoKYGBge3IgZmlnLmhlaWdodD03fQojIFJlY291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGdlbnVzIGFmdGVyIHRoZSBhZ2dyZWdhdGlvbgpDZXRhY2VhX29jYyRnZW51c19jb3VudCA8LSBzYXBwbHkoQ2V0YWNlYV9vY2MkZ2VudXMsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjJGdlbnVzKVt4XX0pCkNldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXNfY291bnQgPC0gc2FwcGx5KENldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXMsIGZ1bmN0aW9uKHgpe3RhYmxlKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4kZ2VudXMpW3hdfSkKCm9tZWdhIDwtIDAuMwpnZW51c19jb3VudCA8LSBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kZ2VudXNfY291bnQKZGVucyA8LSBzYXBwbHkoMTptYXgoZ2VudXNfY291bnQpLCBmdW5jdGlvbihuKXsgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kYWdlX2NvbWJpbmVkX3JhbmdlKSR2YWx1ZSB9KQpnZW51c19jb3VudF9jYXRlZ29yaWVzIDwtIHRhYmxlKGdlbnVzX2NvdW50KS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGdlbnVzX2NvdW50KSkpICAjIE51bWJlciBvZiBjYXRlZ29yaWVzIHdpdGggMSwgMiwgMywgLi4uIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIGdlbnVzCgojIENvbXBhcmUgdGhlIGluaXRpYWwgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY1tDZXRhY2VhX29jYyRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0sIAogICAgICAgYWVzKHg9Z2VudXNfY291bnQsIAogICAgICAgICAgIHk9Z2VudXNfY291bnRfY2F0ZWdvcmllc1thcy5mYWN0b3IoZ2VudXNfY291bnQpXSwgCiAgICAgICAgICAgZmlsbD1hY2NlcHRlZF9yYW5rKSkgKwogIGdlb21fcG9pbnQoKSArCiAgCiAgYW5ub3RhdGUoImxpbmUiLCB4ID0gMTptYXgoZ2VudXNfY291bnQpLCB5PSBkZW5zCiAgICAqbWF4KCh0YWJsZShnZW51c19jb3VudCkvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShnZW51c19jb3VudCkpKSlbYXMuZmFjdG9yKGdlbnVzX2NvdW50KV0pIC9tYXgoZGVucykpKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBnZW51cyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGdlbmVyYSAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiKQoKZ2VudXNfY291bnRfYWdncmVnIDwtIENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRhY2NlcHRlZF9yYW5rICVpbiUgYygic3BlY2llcyIsICJnZW51cyIpLF0kZ2VudXNfY291bnQKZGVuc19hZ2dyZWcgPC0gc2FwcGx5KDE6bWF4KGdlbnVzX2NvdW50X2FnZ3JlZyksIGZ1bmN0aW9uKG4pewogICAgIGV4cGVjdGVkX2Rpc3RyaWJ1dGlvbihuLCBvbWVnYSwgQ2V0YWNlYV9vY2NfYWdncmVnX2dlbltDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSRhZ2VfY29tYmluZWRfcmFuZ2UpJHZhbHVlCiAgICB9KQoKIyBOdW1iZXIgb2YgY2F0ZWdvcmllcyB3aXRoIDEsIDIsIDMsIC4uLiBvY2N1cnJlbmNlcyBvZiB0aGUgc2FtZSBnZW51cwpnZW51c19jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZyA8LSB0YWJsZShnZW51c19jb3VudF9hZ2dyZWcpL2FzLm51bWVyaWMobmFtZXModGFibGUoZ2VudXNfY291bnRfYWdncmVnKSkpCgojIE51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBjYXRlZ29yeQpDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGdlbnVzX2NhdGVnb3JpZXNfY291bnQgPC0gYXMubnVtZXJpYyhnZW51c19jb3VudF9jYXRlZ29yaWVzX2FnZ3JlZ1thcy5mYWN0b3IoQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRnZW51c19jb3VudCldKQoKIyBDb21wYXJlIHRoZSBjb3JyZWN0ZWQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIHdpdGggdGhlIHRoZW9yZXRpY2FsIGN1cnZlCmdncGxvdChDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdLCAKICAgICAgIGFlcyh4PWdlbnVzX2NvdW50LAogICAgICAgICAgIHk9Z2VudXNfY2F0ZWdvcmllc19jb3VudCwKICAgICAgICAgICBzaXplPWdlbnVzX2NhdGVnb3JpZXNfY291bnQpKSArCiAgZ2VvbV9wb2ludCgpICsKICAKICBhbm5vdGF0ZSgibGluZSIsIHggPSAxOm1heChnZW51c19jb3VudF9hZ2dyZWcpLCB5PSBkZW5zX2FnZ3JlZwogICAgKm1heCgodGFibGUoZ2VudXNfY291bnRfYWdncmVnKS9hcy5udW1lcmljKG5hbWVzKHRhYmxlKGdlbnVzX2NvdW50X2FnZ3JlZykpKSlbYXMuZmFjdG9yKGdlbnVzX2NvdW50X2FnZ3JlZyldKSAvbWF4KGRlbnNfYWdncmVnKSkgKwogIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyBieSBnZW51cyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIGdlbmVyYSAobG9nLXNjYWxlKSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9Ik9ic2VydmVkIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdndGl0bGUoIkNvbXBhcmlzb24gYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9ucyBvZiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMsIGFmdGVyIGFnZ3JlZ2F0aW5nIGluIGdlb3BsYXRlcyIpCgpnZW51c19jb3VudF9hZ2dyZWcgPC0gQ2V0YWNlYV9vY2NfYWdncmVnX2dlbltDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSRnZW51c19jb3VudApkZW5zX2FnZ3JlZyA8LSBzYXBwbHkoMTptYXgoZ2VudXNfY291bnRfYWdncmVnKSwgZnVuY3Rpb24obil7CiAgICAgZXhwZWN0ZWRfZGlzdHJpYnV0aW9uKG4sIG9tZWdhLCBDZXRhY2VhX29jY19hZ2dyZWdfZ2VuW0NldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSxdJGFnZV9jb21iaW5lZF9yYW5nZSkkdmFsdWUKICAgIH0pCmdlbnVzX2NvdW50X2NhdGVnb3JpZXNfYWdncmVnIDwtIHRhYmxlKGdlbnVzX2NvdW50X2FnZ3JlZykvYXMubnVtZXJpYyhuYW1lcyh0YWJsZShnZW51c19jb3VudF9hZ2dyZWcpKSkgICMgTnVtYmVyIG9mIGNhdGVnb3JpZXMgd2l0aCAxLCAyLCAzLCAuLi4gb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUgZ2VudXMKYGBgCgokXHRvJCBUaGUgY29ycmVzcG9uZGFuY2UgaXMgbXVjaCBsZXNzIGltcHJvdmVkIHRoYW4gd2l0aCBzcGVjaWVzIGFnZ3JlZ2F0aW9uIGJlY2F1c2Ugc29tZSBnZW5lcmEgaGF2ZSBhIGxvdCBvZiBvY2N1cnJlbmNlcyBkdWUgdG8gdGhlaXIgaGlnaCBudW1iZXIgb2Ygc3BlY2llcyBzcGVjaWVzIDoKCmBgYHtyfQp0YWJsZShkcm9wbGV2ZWxzKENldGFjZWFfb2NjX2FnZ3JlZ19nZW5bKENldGFjZWFfb2NjX2FnZ3JlZ19nZW4kYWNjZXB0ZWRfcmFuayAlaW4lIGMoInNwZWNpZXMiLCAiZ2VudXMiKSkgJiAoQ2V0YWNlYV9vY2NfYWdncmVnX2dlbiRnZW51c19jb3VudD4yNSksXSRnZW51cykpCmBgYAoKYGBge3IgZmlnLmhlaWdodD02fQpjb25kaXRpb25zIDwtIENldGFjZWFfb2NjJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIikKCnAxIDwtIGdncGxvdChDZXRhY2VhX29jY1tjb25kaXRpb25zLF0sIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD1OQSwgY29sPSJyZWQiKSArCiAgeGxpbSgtbWF4KENldGFjZWFfb2NjW2NvbmRpdGlvbnMsXSRhZ2VfcnVuaWYpLTEsIDEpICsKICB5bGltKDAsIDEwMCkgKwogIHRoZW1lX3ZvaWQoKQoKcDIgPC0gZ2dwbG90KENldGFjZWFfb2NjX3NhbXBsZWQsIGFlcyh4PS1hZ2VfcnVuaWYpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjUsIGFscGhhPTAuNSwgZmlsbD0iYmx1ZSIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgMTAwKSArCiAgdGhlbWVfdm9pZCgpCgpwMyA8LSBnZ3Bsb3QoQ2V0YWNlYV9vY2NfYWdncmVnX2dlbltDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksXSwgYWVzKHg9LWFnZV9ydW5pZikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgYWxwaGE9MC41LCBmaWxsPSJncmVlbiIpICsKICB4bGltKC1tYXgoQ2V0YWNlYV9vY2NbY29uZGl0aW9ucyxdJGFnZV9ydW5pZiktMSwgMSkgKwogIHlsaW0oMCwgMTAwKSArCiAgdGhlbWVfdm9pZCgpCgpwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkiKQoKcDEgKyBhbm5vdGF0aW9uX2N1c3RvbShnZ3Bsb3RHcm9iKHAzKSkgKyBnZ3RpdGxlKCJJbml0aWFsIG9jY3VycmVuY2VzIGRpc3RyaWJ1dGlvbiAocmVkKSBhbmQgY29tcGFyaXNvbiBhZnRlciBhZ2dyZWdhdGluZyBpbiBnZW9wbGF0ZXMgKGdyZWVuKSIpCgpwMSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDIpKSArIGFubm90YXRpb25fY3VzdG9tKGdncGxvdEdyb2IocDMpKSArIGdndGl0bGUoIkluaXRpYWwgb2NjdXJyZW5jZXMgZGlzdHJpYnV0aW9uIChyZWQpIGFuZCBjb21wYXJpc29uIGFmdGVyIHN1Yi1zYW1wbGluZyAoYmx1ZSkgb3IgYWdncmVnYXRpbmcgaW4gZ2VvcGxhdGVzIChncmVlbikiKQpgYGAKCiRcdG8kIERlbGltaXRpbmcgYnkgZ2VvbG9naWNhbCBwbGF0ZXMgKCsgYWdlKSBpbnN0ZWFkIG9mIGNvdW50cmllcyAoKyBhZ2UpIGxlYWRzIHRvIHNpbWlsYXIgZGlzdHJpYnV0aW9ucywgd2l0aCBhIGJpdCBtb3JlIG9jY3VycmVuY2VzLCBzbyB3ZSB3aWxsIGtlZXAgaXQuCgpgYGB7cn0Kd3JpdGUudGFibGUoQ2V0YWNlYV9vY2NfYWdncmVnX2dlbltDZXRhY2VhX29jY19hZ2dyZWdfZ2VuJGFjY2VwdGVkX3JhbmsgJWluJSBjKCJzcGVjaWVzIiwgImdlbnVzIiksIGMoIm1pbl9tYSIsICJtYXhfbWEiKV0sCiAgICAgICAgICAgIGZpbGU9Ii4uL2RhdGEtY2V0YWNlYW5zL0NldGFjZWFfb2NjdXJyZW5jZXNfbWluX21heF9hZ2VfZ2VuZXJhX2NvcnJlY3RlZC5jc3YiLCBzZXA9IiwiLCByb3cubmFtZXM9RkFMU0UsIGNvbC5uYW1lcz1GQUxTRSkKYGBgCgojIENvbmNsdXNpb25zCgpBY2hpZXZlbWVudHMgOgoKICAtIEl0IHNlZW1zIHBvc3NpYmxlIHRvIGFkZXF1YXRlbHkgcmVkdWNlIHRoZSBhYnVuZGFuY2UgYmlhcyBieSBzdWJzYW1wbGluZyB0aGUgbW9zdCBjb25jZW50cmF0ZWQgaW50ZXJ2YWxzICRcdG8kICoqc3BlY2llcyBvbmx5KioKICAtIFVzaW5nIGNvbWJpbmVkIHJhbmdlcyBieSBzcGVjaWVzIGFwcGVhcnMgdG8gYmUgbW9yZSByb2J1c3QgJFx0byQgKip0byBiZSBjb25maXJtZWQqKgogIC0gVmVyeSByZWNlbnQgc2FtcGxlcyBtYXkgaGF2ZSBiZWVuIGRhdGVkIHdpdGggYSBtb3JlIHByZWNpc2UgbWV0aG9kIGFuZCBjb250YWluIG11Y2ggbW9yZSBmb3NzaWxzLCBzbyB0aGV5IHNob3VsZCBiZSByZW1vdmVkIG9yIHRyZWF0ZWQgc2VwYXJhdGFkZWx5ICRcdG8kICoqYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBuZWVkZWQqKgoKT3BlbiBxdWVzdGlvbnMgOgoKICAtIFdoYXQgYWJvdXQgb3RoZXIgYWNjZXB0ZWQgcmFua3MgPwogICAgMS4gVGhlIHByb2JsZW0gaXMgdGhhdCBkaWZmZXJlbmNlcyBpbiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGF0IGhpZ2hlciByYW5rcyBjb3VsZCBiZSBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gaW5kaXZpZHVhbCBhYnVuZGFuY2VzIGluc2lkZSBzcGVjaWVzIG9yIGR1ZSB0byBkaWZmZXJlbmNlcyBpbiB0aGUgbnVtYmVyIG9mIHNwZWNpZXMgaW5zaWRlIHRoYXQgZ3JvdXAuCiAgICAyLiBBIHNvbHV0aW9uIGNvdWxkIGJlIHRvIGxvb2sgYXQgdGhlIG51bWJlciBvZiBzcGVjaWVzIGJ5IGdyb3VwIGJhc2VkIG9uIHRoZSBpbmRpY2F0ZWQgc3BlY2llcywgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIGJpYXMgY29ycmVjdGlvbiA6IGhvbW9nZW5laXppbmcgdGhlICpudW1iZXIgb2Ygb2NjdXJyZW5jZXMgLyB0aW1lIHVuaXQgLyBudW1iZXIgc2Ygc3BlY2llcyBpbiB0aGUgZ3JvdXAqICRcdG8kICoqYWRkaXRpb25hbCBkYXRhIHJlcXVpcmVkKiogKHJhbmtzIGNsYXNzaWZpY2F0aW9uKQogIC0gV2h5IGRvIG1vc3Qgb2NjdXJyZW5jZXMgbWlzcyBhIGxhdGUgc3RyYXRpZ3JhcGhpYyBsaW1pdCA/CiAgLSBTb21lIG9jY3VycmVuY2VzIGhhdmUgdmVyeSBodWdlIHRpbWUgaW50ZXJ2YWxzICRcdG8kICoqV2FzIGlzIGEgZ29vZCBpZGVhIHRvIHJlbW92ZSB0aG9zZSA+MTBNeSA/IFNob3VsZCB3ZSByZW1vdmUgbW9yZSBvZiB0aGVtICg+NU15KSA/KioKCgogICAgCiAgICA=